1. 什么叫做事务?

2.默认情况下每一条sql语句都是一个事务,然后自动提交事务  ps:如果想多条语句占一个事务,则可以手动设置SetAutoCommit为false

3.关键字 start transaction;rollback;commit

  3.1 练习 创建account表(id,name,money),插入两条数据(a,b);start transaction;set a+100,set b-100;commit rollback

create table account(
id int primary key auto_increment,
name varchar(20),
money double  //在MySQL中没有money类型
);
insert into account values(null,'a',1000),(null,'b',1000)
start transaction
update account set money = money -100 where name='a';
update account set money = money +100 where name='b';
commit;

View Code

4.jdbc中事务管理

5. 设置回滚点

6.事务的四大特性(ACID)

总结:这一节主要讲了事务的概念;jdbc中使用事务;事务的四大特性


二、隔离性

事务的四大特性,前三点数据库能很好的帮我实现,我们重点来谈下隔离性。

ps:如果用单线程来实现隔离性的话(也就是用lock的方式),会降低数据库的性能和效率

1.不考虑隔离性可能造成的问题 ps:我们只要考虑这三个方面的问题两个人同时修改,两个人同时读,一读一改,这三种情况都考虑到了那么所有的问题都考虑到了

  1.1 两个人同时修改

    用lock来解决两个人同时修改的线程安全问题

  1.2 两个人同时读

    两个人同时读不存在线程安全问题

  1.3 一读一改  ps:一读一改会出现三个问题:脏读、不可重复读、虚读

    1.3.1 脏读

         脏读就是读到了其他事务没有提交的数据  ps:比如a(淘宝买家)、b(淘宝卖家),a开启事务向b打了100块钱但是事务还未提交然后告诉b说我已经向你支付了100请你发货,这个时候b去账户查了一下果然多了100块于是给a发了货,但是这个时候a做了rollback操作,结果b亏了100钱的货(事务举例常用银行转账跟购物)

b卖家进行的操作:
select @@tx_isolation;
set transaction isolation level read uncommitted;
start transaction;
//b一直在等待a付款,当a付款后告诉b发货时b去查了一下自己的账号
select * from account where name='b';
//这个时候b发现自己的账户中确实多了100快,当时万万没有想到此时a做了rollback的操作

a买家进行的操作:
start transaction;
update account set money = money -100 where name='a';
update account set money = money +100 where name ='b';
//这个时候a告诉卖家b说我已经给你打款了,你赶快给我发货吧
//当b发货之后a做了rollback的操作
rollback;

View Code

    1.3.2 不可重复读

        在同一个事务中多次读取的结果不一样,原因就是有人修改了数据  ps:举例,银行工作人员报表统计

b卖家进行的操作:(b开始的)
select @@tx_isolation;
set transaction isolation level read uncommitted;
//一开始b就在等待其他买家付款,所以一开始就开启了一个事务查询了自己的账户
start transaction;
select * from account where name='b';
//这个时候查到的钱是1100,之后一直在等待买家a付款
……
//卖家b在接到买家a的付款通知之后查询了下自己的账户
select * from account where name='b';
//这个时候得到的金额数为1200了这个时候就出现了同一个事务类查询的结果不一样了,也就是不可重复读(在有些情况下这种不可重复是正确的)
a买家进行的操作:
//买家a向卖家b付了一百块钱
start transaction;
update account set money = money -100 where name='a';
update account set money = money +100 where name ='b';
commit;
//买家a提交事务之后就通知卖家b

View Code

    1.3.3 虚读(幻读)

         一个事务读取了别的事务插入的 数据,导致前后读取不一致(读到不存在的数据,所以叫虚读)

b银行业务员进行的操作:(b开始的)
select @@tx_isolation;
set transaction isolation level read uncommitted;
//一开始b就开启一个事务,统计开户总数
start transaction;
select count(*) from account;
//这个时候查到的个数是2,正在这个时候用户a在银行开一新户
……
select count(*) from account;
////这个时候查到的个数是3,这个时候就出现了幻读虚读,读取了其他事务新插入的数据

a用户进行的操作:
//用户a开户
start transaction;
insert into account values(null,'c',1300);
commit;
//用户a开了户之后,业务员b又做了一次统计

View Code

2.数据库的四大隔离级别(read uncommitted、read committed、repeateable read、serializable)

  2.1 read uncommitted  不防止任何隔离性的问题(脏读、不可重复读、虚读的问题都存在)

  2.2 read committed  能防止脏读,但是不能防止不可以重复读和虚读

  2.3 repeatable read 能脏读、不可重复读,但是不能防止虚读

  2.4 serializable 能防脏读、不可重复读、虚读,但是效率是最低的

  2.5 补充

    2.5.1 查询数据库的隔离级别   select @@tx_isolation

    2.5.2 设置数据库的隔离级别  set [global/session] transaction isolaiton level  XXX 不加global和session的话指修改客户端的隔离级别

    2.5.3 个人对隔离性的理解   PS:其实就是利用锁机制控制我在进行事务的时候你能做什么操作(读、写、修改、插入crud)

          开启一个事务就好像复制了一份数据,该事务设置的隔离级别就是该数据被其他事务影响的程度。read uncommitted 则其他事务为提交的事务也能影响到改数据,read committed 则是提交后的数据能影响到,repeatable read 则未提交和已经提交的修改数据都不能影响到该数据但是新插入的数据可以影响到,serializable则该数据不受任何的影响


三、数据库中的锁机制

1.共享锁:在非serializable隔离i级别下做查询不加任何锁,而在serializable隔离级别下做查询加共享锁

  1.1 共享锁的特点:共享锁可以与共享锁共存,共享锁不能排他锁共存

2. 排他锁:在所有隔离级别下做修改都会加排他锁

  2.1 排他锁和其他任何锁都不能共存

3.补充

  3.1 sql语句的执行顺序

    from where select group by having order by

  3.2 用sql语句选出每个科目成绩最好的

    select max(socre) from t_score group by subject  ps:按照sql语句的执行顺序先from表在内存中有一段数据块然后根据subject分组,摞成一小堆(在数据库查询的时候我们只能看到最上面那个),然后我们再在一摞摞的小组中选出分数最大的

  3.3 选出各个科目成绩前两名的学生 问题拆分:先选出一门具体学科成绩的前两名;各个学科相当于条件扩大到了所有学科如select top 2 from score where subject in(select subject from score )


四、更新丢失问题

1.问题描述:不同的用户,基于相同的查询结果,更新时(多个线程)出现覆盖的问题


转载于:https://www.cnblogs.com/lihongchen/p/4476751.html

传智播客JavaWeb day11--事务的概念、事务的ACID、数据库锁机制、相关推荐

  1. 传智播客 mysql视频_MySQL数据库传智播客视频教程【43集】

    教程名称:MySQL数据库传智播客视频教程[43集] 教程目录:[一品资源网]传智播客PHP培训_PHP视频教程 Mysql 第01讲 介绍与安装 [一品资源网]传智播客PHP培训_PHP视频教程 M ...

  2. 传智播客 php培训 mysql 刘道成 word 文档,传智播客 刘道成PHP视频教程 mysql 数据库视频教程...

    记得14年的时候有整理过这套课程,但是课程太多 今天却翻不到,所以在这里发一下吧. 4 ]0 {2 I. c- Z! u0 h6 J5 x传智播客出品 讲师 刘道成 Mysql 视频教程 mysql和 ...

  3. 【传智播客】Javaweb程序设计任务教程 黑马程序员 课后答案【合集】

    [传智播客]Javaweb程序设计任务教程 黑马程序员 第一章 课后答案 [传智播客]Javaweb程序设计任务教程 黑马程序员 第二章 课后答案 [传智播客]Javaweb程序设计任务教程 黑马程序 ...

  4. 【传智播客】JavaWeb程序设计任务教程 第四章练习答案

    更多教材解析.练习答案见我的<答案解析系列>博客专栏哦-->答案解析专栏网址 1.一次重定向过程中,浏览器会发出多少次服务器请求( ) A.1次 B.2次 C.0次 D.3次 2.下 ...

  5. 传智播客西安中心之Android课程大纲

    2015年JavaEE+Android就业班课程详解 全价22980元,优惠价18980元!(享受优惠价的条件是什么?) 前言:你已经错过做移动互联时代的领头羊,难道15年你还要继续埋没在茫茫人海中吗 ...

  6. 传智博客(JavaWeb方面的所有知识)听课记录(经典)

    一.       JavaWeb基础 第一天: 1.Eclipse详解: (1).Bad versionnumber in .class file:编译器版本和运行(JRE)版本不符合.高的JRE版本 ...

  7. php从入门到精通19天笔记,传智播客-PHP从入门到精通(19天)-video

    教程名称:传智播客-PHP从入门到精通(19天)-video 教程目录:├PHP传智社区学习资源.zip├下载必看 .txt├│  ├10目录访问权限(包括分布式权限).wmv│  ├11多站点配置. ...

  8. 创智播客微服务_传智播客2018JavaEE IDEA版本

    资源内容: 传智播客2018JavaEE IDEA版本|____Java课件IDEA          |____主流框架          |____流行框架          |____Java基 ...

  9. Ubuntu16.04 ROS 深度学习_传智播客 智能机器人软件开发 学习路线图出炉!首发优惠!!...

    黑马程序员 微信号:heiniu526 传智播客旗下互联网资讯,学习资源免费分享平台 智能机器人软件工程师学习计划 很多朋友对机器人软件开发和人工智能感兴趣,不知道怎么学习,传智播客武汉校区在今年3月 ...

最新文章

  1. 'libxml/tree.h' file not found
  2. jquery ajax中使用jsonp的限制[转]
  3. SAP Marketing Cloud里的contact main facet是什么意思
  4. UIButton-初识IOS
  5. pdf上传及预览;file上传pdf文件及预览;vue上传pdf文件及预览;vue-pdf预览pdf文件
  6. Flash Builder 找不到Adobe Flash Player或者Flash Builder 找不到debug版本的解决方法
  7. 845. 数组中的最长山脉
  8. 给WP7初学者:《WP7 Dev Quick Start系列视频》
  9. 程序员除了写代码,还应重视哪些方面?
  10. .Net获取URL中文参数值乱码问题
  11. C# 数据库访问类源代码
  12. 最新MT2503_GPS调试工具资料下载
  13. sqlbulkcopy是覆盖式更新吗_关于5G消息,这五点你知道吗?
  14. 北京航空航天大学经管学院《量化交易与大数据金融》课程实验 :自选至少5支基金,和一个大盘指数,比较这5支基金的信息比率
  15. 软件:汽车的灵魂操盘手
  16. OpenCV 获取图像像素的最大最小值及其对应的位置 minMaxLoc(仅适用于单通道图像)
  17. 区块链是如何解决慈善公益项目中存在的问题呢?
  18. visitor模式入门
  19. Ear Clipping算法简介
  20. 新手对Ubuntu应该这么学!

热门文章

  1. 牛客练习赛36 Rabbit的字符串(最小表示法)
  2. 线程间同步的几种方法--互斥锁,条件变量,信号量,读写锁
  3. Linux信号量之用户态信号量(Posix信号量->无名信号量)
  4. pytorch 之 保存不同形式的预训练模型
  5. numpy高级操作,求高维矩阵的距离矩阵(方阵)以及 求某一个维度的累加和 , 矩阵切片操作
  6. c modern approach‘s forteenth chapter‘s study
  7. C++ vector容器删除操作
  8. 计算机应用技术教程的答案,计算机应用技术教程第3章办公自动化答案
  9. 简明 XHTML 1.0 参考手册
  10. Linux查看版本当前操作系统内核信息