在MYSQL的事务引擎中,INNODB是使用范围最广的。它默认的事务隔离级别是REPEATABLE READ(可重复读),在标准的事务隔离级别定义下,REPEATABLE READ是不能防止幻读产生的。INNODB使用了2种技术手段(MVCC AND GAP LOCK)实现了防止幻读的发生。
现在的问题是,光MVCC就能够防止幻读了,为什么在加锁的时候还要使用GAP LOCK??
...全文
31311打赏收藏
MYSQL innodb引擎下的防幻读问题
在MYSQL的事务引擎中,INNODB是使用范围最广的。它默认的事务隔离级别是REPEATABLE READ(可重复读),在标准的事务隔离级别定义下,REPEATABLE READ是不能防止幻读产生的。INNODB使用了2种技术手段(MVCC AND GAP LOCK)实现了防止幻读的发生。 现在的问题是,光MVCC就能够防止幻读了,为什么在加锁的时候还要使用GAP LOCK??
这一块,你的理解可能有误,
select: Its creation id must be less than or equal to the system version number. This ensures that the row was created before the current query began.
这里只是说系统版本号,应该是所有会话的最大的事务版本号
INSERT
When a row is added to a table, the database server records the current version number along with the new row, using it as the row's creation id.
这里才说是当前版本号,应该是当前会话的