Mysql InnoDB下事物并发的理解

2019-07-24  本文已影响0人  吕光朝

什么是事物:

       因为业务的需要,mysql需要引入事物的概念(此概念不做具体介绍)

事物并发产生的问题 :

       事物并发执行的时候会产生一些问题,如下

       脏读:一个事物读取到了例外一个事物没有提交的数据,如何此时例外一个事物回滚, 相当于读取到了脏数据

       不可重复读:一个事物在读取过程中 读取到了其他事物修改的数据,导致多次数据读取不一致

       幻读:一个事物在读取过程中 读取到了其他事物新增的数据,导致多次数据读取不一致

 解决方案:

        一:可以通过加锁的方式来解决上述问题,例如,读的时候加共享锁,此时其他事物无法修改相应的数据,写的时候加排他锁

禁止其他事物读写操作,但是这种做法性能较差

     二:基于性能的考虑 mysql InnoDB引擎实现了 多版本并发控制(MVCC),这是一种乐观锁的实现方式;MVCC 在读已提交 和 可重复读 2种隔离级别下工作;

           在MVCC中,读操作可以分成两类,快照读(Snapshot read)和当前读(current read)。快照读,读取的是记录的可见版本(可能是历史版本,即最新的数据可能正在被当前执行的事务并发修改),不会对返回的记录加锁;而当前读,读取的是记录的最新版本,并且会对返回的记录加锁,保证其他事务不会并发修改这条记录,所以说MVCC解决了不可重复读的问题,因为当前读读取的是最新的版本,所以还是会出现幻读的情况,

          Mysql通过间隙锁的方式解决了 幻读 的问题,一种锁定索引记录间隙,确保索引记录的间隙不变的加锁方式,间隙锁仅发生于检索条件有非唯一索引,RR级别下;唯一索引下 由于其唯一性,排序性没有间隙

       

上一篇 下一篇

猜你喜欢

热点阅读