mysql的record锁如何解决_MySQL Record,Gap,next_key 锁,幻读现象

下面测试,验证mysql 在Read-committed,Repeatable-read

隔离级别分别使用哪种行级锁,以及如何避免幻读现象?

a4c26d1e5885305701be709a3d33442f.png

结论:RC模式下,是有可能出现不重复读(读取mvcc最新版本),幻读现象,我们在session2步骤2,3应该有一个疑问,session1给twe

加了互斥锁,为什么session2能够插入新行呢?答案该锁是行级锁,没有使用next_key

锁,所以新的行能够被插入。下面测试Repeatable-read 隔离级别的情况?

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

结论:我们在步骤3,4应该有一个疑问,session1给twe

加了互斥锁,为什么session2能够插入新行呢?答案该锁是行级锁。虽然RR模式下,session1

步骤3,6读取结果不一致,出现了幻读现象。这一点我们在前一篇文章解释:select 使用锁(lock in share

mode,for update)来获取一致读,是获取行最新的镜像。如何解决这个问题?

a4c26d1e5885305701be709a3d33442f.png

结论:测试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 特性,是否出现幻读,依赖锁的粒度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值