一、事务的基本要素

  1、原子性:事务开始后的所有操作,要么全部做完,要么全部不做,不能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没发生一样。也就是说事务是一个不可分割的整体。

  2、一致性:事务开始前和开始后,数据库的完整性约束没有被破坏。A向B转钱,不能A扣钱B收不到钱。

  3、隔离性:同一时间,只允许一个事务请求同意数据,不同事务之间彼此没有任何干扰。比如A存钱的过程中,B不能取钱。

  4、持久性:事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

二、事物的并发问题

  1、脏读:事务A读取事务B更新的数据,然后B回滚操作,那么A读到的是脏数据。与数据库中不符。

  2、不可重复读:事务A多次读取同一数据,事务B在事务A多次读取过程中,对数据进行了更新并提交,导致事务A多次读取同一数据时,结果不一致。

  3、幻读:A在读取数据库中的是数据的时候将所有的具体数据改成ABCDE等级,如:99分改成A级,但是这个时候B突然插入一条具体的数据,A就发现还有一条没有改变过来,像是幻觉一样,叫做幻读。

  小结:不可重复读和幻读的区别就是,不可重复读侧重于修改提交,幻读侧重于增加和删除。解决不可重复的方法是只需锁住满足条件的行,幻读的解决办法是锁住所需要的表。

三、Mysql的事物的隔离级别

四、用例子说明各个隔离级别的情况

  1、读未提交:

    (1)打开一个客户端A,并设置当前事务模式为read uncommitted(未提交读),查询表account的初始值:

    (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account:

    (3)这时,虽然客户端B的事务还没提交,但是客户端A就可以查询到B已经更新的数据:

    (4)一旦客户端B的事务因为某种原因回滚,所有的操作都将会被撤销,那客户端A查询到的数据其实就是脏数据:

    (5)在客户端A执行更新语句update account set balance = balance - 50 where id =1,lilei的balance没有变成350,居然是400,是不是很奇怪,数据不一致啊,如果你这么想就太天真 了,在应用程序中,我们会用400-50=350,并不知道其他会话回滚了,要想解决这个问题可以采用读已提交的隔离级别

  2、读已提交

    (1)打开一个客户端A,并设置当前事务模式为read committed(未提交读),查询表account的所有记录:

    (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account:

    (3)这时,客户端B的事务还没提交,客户端A不能查询到B已经更新的数据,解决了脏读问题:

    (4)客户端B的事务提交

    (5)客户端A执行与上一步相同的查询,结果 与上一步不一致,即产生了不可重复读的问题

  3、可重复读

    (1)打开一个客户端A,并设置当前事务模式为repeatable read,查询表account的所有记录

    (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account并提交

    (3)在客户端A查询表account的所有记录,与步骤(1)查询结果一致,没有出现不可重复读的问题

    (4)在客户端A,接着执行update balance = balance - 50 where id = 1,balance没有变成400-50=350,lilei的balance值用的是步骤(2)中的350来算的,所以是300,数据的一致性倒是没有被破坏。可重复读的隔离级别下使用了MVCC机制,select操作不会更新版本号,是快照读(历史版本);insert、update和delete会更新版本号,是当前读(当前版本)。

(5)重新打开客户端B,插入一条新数据后提交

(6)在客户端A查询表account的所有记录,没有 查出 新增数据,所以没有出现幻读

补充:

  1、事务隔离级别为读提交时,写数据只会锁住相应的行

  2、事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。

  3、事务隔离级别为串行化时,读写数据都会锁住整张表

   4、隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

  

最新文章

  1. Dell服务器安装OpenManage(OMSA)
  2. 关于JSPatch热修复
  3. [转发]UML类图符号 各种关系说明以及举例
  4. iOS:app直播---采集篇
  5. Java程序员面试失败的5大原因
  6. POJ2200+全排列模拟
  7. Qt5+VS2013兼容XP方法
  8. WPF关于“在“System.Windows.Markup.StaticResourceHolder”上提供值时引发了异常。”问题解决办法
  9. 用smarty模板做的登录
  10. centOS7 mini配置linux服务器(三) 配置防火墙以及IPtables切换
  11. swift - uicollectionView自定义流水布局
  12. 201521123070 《JAVA程序设计》第3周学习总结
  13. 一步使你的asp.net网站在手机浏览器上全屏显示
  14. jQuery 捕获
  15. python 速记正则使用(转)
  16. SpringBoot基础系列-使用日志
  17. linux下mycat自启动方法
  18. IMAGENT CLASSIFICATION WITH DEEP CONVOLUTIONAL NEURAL NETWORKS(翻译)
  19. elasticsearch更新doc文档
  20. mysql设置环境变量

热门文章

  1. kotlin之MutableMap委托
  2. python中的tcp示例详解
  3. flask_security学习笔记
  4. 【403】COMP9024 Exercise
  5. java+断点续传
  6. cv2.bitwise_and的应用,
  7. JAVA 基础编程练习题31 【程序 31 数组逆序】
  8. jvm的内存结构和gc的回收
  9. ss user-rule自定义规则并硬连接到OneDrive进行自动同步
  10. IIS 6.0的web园 最大工作进程数细谈