什么是事物:
因为业务的需要,mysql需要引入事物的概念(此概念不做具体介绍)
事物并发产生的问题 :
事物并发执行的时候会产生一些问题,如下
脏读:一个事物读取到了例外一个事物没有提交的数据,如何此时例外一个事物回滚, 相当于读取到了脏数据
不可重复读:一个事物在读取过程中 读取到了其他事物修改的数据,导致多次数据读取不一致
幻读:一个事物在读取过程中 读取到了其他事物新增的数据,导致多次数据读取不一致
解决方案:
一:可以通过加锁的方式来解决上述问题,例如,读的时候加共享锁,此时其他事物无法修改相应的数据,写的时候加排他锁
禁止其他事物读写操作,但是这种做法性能较差
二:基于性能的考虑 mysql InnoDB引擎实现了 多版本并发控制(MVCC),这是一种乐观锁的实现方式;MVCC 在读已提交 和 可重复读 2种隔离级别下工作;
在MVCC中,读操作可以分成两类,快照读(Snapshot read)和当前读(current read)。快照读,读取的是记录的可见版本(可能是历史版本,即最新的数据可能正在被当前执行的事务并发修改),不会对返回的记录加锁;而当前读,读取的是记录的最新版本,并且会对返回的记录加锁,保证其他事务不会并发修改这条记录,所以说MVCC解决了不可重复读的问题,因为当前读读取的是最新的版本,所以还是会出现幻读的情况,
Mysql通过间隙锁的方式解决了 幻读 的问题,一种锁定索引记录间隙,确保索引记录的间隙不变的加锁方式,间隙锁仅发生于检索条件有非唯一索引,RR级别下;唯一索引下 由于其唯一性,排序性没有间隙
网友评论