MySQL事务隔离级别以及验证

事务的并发执行,容易出现的几个现象

--------------------------
    1.脏读
        读未提交,一个事务读取了另外一个事务改写还没有提交的数据,如果另外一个
        事务在稍后的时候回滚。
 
    2.不可重复读
        一个事务进行相同条件查询连续的两次或者两次以上,每次结果都不同。
        有其他事务做了update操作。
 
    3.幻读
        和(2)很像,其他事务做了insert操作.
 
隔离级别
----------------
    为了避免出现哪种并发现象的。
    1        //read uncommitted    ,读未提交
    2        //read committed    ,读已提交
    4        //repeatable read    ,可以重复读
    8        //serializable        ,串行化(悲观锁)
 
 
验证 
  1 第一个级别验证   读未提交  有脏读问题 
    切换数据库 
  MySQL事务隔离级别以及验证

  查询初始数据

  MySQL事务隔离级别以及验证

  开启A事务  并做更新操作

MySQL事务隔离级别以及验证

  MySQL事务隔离级别以及验证

  再另一端 B开始另一个事务查询 事务级别设置为读未提

MySQL事务隔离级别以及验证

查询到事务未提交的数据  a的count修改为3 但是没有提交

MySQL事务隔离级别以及验证

2 第二个级别 读已提交 避免脏读问题 但是有不可重复读问题

  回滚数据 修改隔离级别 确保都是 读已提交级别

  客户端A

MySQL事务隔离级别以及验证

  客户端B

MySQL事务隔离级别以及验证

 MySQL事务隔离级别以及验证

  验证 脏读问题

  客户端A

MySQL事务隔离级别以及验证

客户端B  查询出结果 没有脏读问题

MySQL事务隔离级别以及验证

A提交事务 B再查询

MySQL事务隔离级别以及验证

MySQL事务隔离级别以及验证

测试不可重复读问题

  A客户端 开始事务 先进行一次查询  仍然设置为读已提交的隔离级别

    MySQL事务隔离级别以及验证

此时 A客户端 没有提交事务 开启B客户端 做更新操作

MySQL事务隔离级别以及验证

    此时A客户端再次查询 结果不一样  在一个事务中 两次查询不一样

    MySQL事务隔离级别以及验证

3 第三个级别 可重复读  避免 不可重复读问题;

  确保客户端A 和 客户端B都是 可重复读的隔离级别

    

MySQL事务隔离级别以及验证

客户端A 第一次查询

MySQL事务隔离级别以及验证

客户端B 开启事务 并更新 然后 提交事务

MySQL事务隔离级别以及验证

这时 客户端A 再次查询数据 仍然是15 所以 避免了不可重复读的问题

MySQL事务隔离级别以及验证

测试幻读问题

    同样保持之前的数据 客户端B开始事务 插入数据

    客户端B

    MySQL事务隔离级别以及验证

    此时 客户端A再次查询 还是一样

MySQL事务隔离级别以及验证

      经过查询  据说来源于 MySQL技术内幕 :InnoDB存储引擎  

      之前提到一般情况下MySQL的InnoDB引擎在可重复读的情况下是没法保证不出现幻读的,但实际情况是MySQL可以通过加锁来防止幻读的出现,这种锁定通过Next-key机制来实现,是属于记录锁和间隙锁(Gap锁)的结合。

  《MySQL技术内幕:InnoDB存储引擎》-第六章:锁

    

  

 

 
 
   

MySQL事务隔离级别以及验证

上一篇:设为首页/加入收藏JS代码


下一篇:【已解决】Vmware无法创建虚拟网卡的问题