下面测试,验证mysql 在Read-committed,Repeatable-read
隔离级别分别使用哪种行级锁,以及如何避免幻读现象?
结论:RC模式下,是有可能出现不重复读(读取mvcc最新版本),幻读现象,我们在session2步骤2,3应该有一个疑问,session1给twe
加了互斥锁,为什么session2能够插入新行呢?答案该锁是行级锁,没有使用next_key
锁,所以新的行能够被插入。下面测试Repeatable-read 隔离级别的情况?
结论:我们在步骤3,4应该有一个疑问,session1给twe
加了互斥锁,为什么session2能够插入新行呢?答案该锁是行级锁。虽然RR模式下,session1
步骤3,6读取结果不一致,出现了幻读现象。这一点我们在前一篇文章解释:select 使用锁(lock in share
mode,for update)来获取一致读,是获取行最新的镜像。如何解决这个问题?
结论:测试3解决测试2的幻读的问题,这是通过next_key 锁锁住行,以及行之间范围。导致阻塞session2的操作。
知识点:
1:Read-committed隔离级读(select without any lock
mode),依靠Innodb mvcc特性,读取行的最新版本。这就可能导致有可能不可重复的读的原因。
2:Repeatable-read 隔离级别读(select without any lock mode),依靠Innodb
mvcc特性。读取行的在事务中最初读取行的版本,可以重复读,但有一个例外情况,详细情况见:http://blog.sina.com.cn/s/blog_aa8dc6080101ftx9.html。
3:不管是RC,RR模式,如果是有锁读(select lock in share mode,or
select for update),读取行的最新版本。
4:Read-committed隔离级,Innodb 使用的行级锁为record lock。
5:Repeattable-read隔离级别下,当禁用innodb_locks_unsafe_for_binlog系统变量。Innodb默认使用next_key(record
+gap )锁,消除幻读现象。当启用innodb_locks_unsafe_for_binlog系统变量。Innodb
使用
record lock,还是出现幻读现象。
6:是否可重复读是依靠Innodb MVCC 特性,是否出现幻读,依赖锁的粒度。