mvcc解决了快照读的幻读,间隙锁解决了当前读的幻读
幻读定义:在一个事务里面两次不同时间的相同查询返回了不同的的结果集,这里的不同主要是指结果集的数量不同,而不是内容不同。
mysql的innodb引擎是通过 "行排他锁+MVCC" 一起实现的, 不仅可以保证可重复读, 还可以部分防止幻读, 而非完全防止;
为啥说并没有完全杜绝呢?下面的情况就是mysql通过next-key锁机制杜绝了一些幻读。
操作流程:(1)T1在查询users
(2)T1更新表中的一列数据,这时候会加next-key锁。
(3)T2事务进行插入操作,由于T1加了next-key锁,所以这里T2插入会阻塞,直到T1提交。
(4)T1在查询数据,所有的users表中那一列的数据都更新了。
如果没有next-key锁机制,T2事务的插入操作不会被阻塞,这时候T1在读的时候就会出现有一行数据没有更新的情况出现。这时候就会出现网上很多博客说的情况。明明更新了所有数据,
但是在查询的时候,还 会出现没有更新的数据,貌似出现了幻觉一样。
但是上面的操作mysql通过next-key锁机制预防了那种情况的发送,所以解决此部分的幻读。
即使有了next-key锁,但是还有一部分幻读怎么没有解决呢?
操作流程:(1)T1在查询users,有五行数据
(2)T2插入中的一行数据,并且提交,目前有六行数据。
(3)T1事务进行更新一列的操作,会影响六行数据。
(4)T1在查询数据,所有的users表中那一列的数据都更新了,但是查询出来了六行数据。
这时候,出现了一次事务两次查询,结果集数量不同,这算是一个种特殊幻读。