为了账号安全,请及时绑定邮箱和手机立即绑定

Mysql事务隔离级别与乐观锁的问题

Mysql事务隔离级别与乐观锁的问题

浮云间 2019-03-29 22:11:29
问题一:当事务隔离级别设置为可重复读的时候,将所有select过的行都加了读锁,并且记录了版本号,当update的时候们如果发现版本号变了,则事务失败回滚。不知道我这样理解是否正确?问题二:如果上面的理解正确,那是否innodb的可重复读这个隔离级别已经帮我们实现了乐观锁,所以并不需要手动通过版本或者时间戳来实现乐观锁,或者使用悲观锁了?问题三:悲观锁select...forupdate是增加了一个写锁?所以所有的读写都会被block住?问题四:假设有事务A,先select然后update,事务B同样也是先select然后再update如果事务隔离级别为可重复读,事务A,B先后select加上了读锁,那么会不会因此而后面的update操作会互相block住,导致死锁?问题一和问题四好像是矛盾的,因为如果问题四成立,事务会block住,也不会修改成功导致版本号不一致导致回滚了。
查看完整描述

2 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

这个问题有些复杂,根据事务隔离的定义,可重复读是需要上读锁的:wiki中文说明wiki英文说明
也就是保证读取的内容不会发生改变。
但根据mysql的文档,innodb的实现机制是在读的时候,建立快照,以保证在单个事务内,读取的内容不会发生变化:mysql文档
那么就是产生了一些微妙的区别。。。虽然对结果来说没区别=。=
问题一二如同@HuanDu所说,没读锁所以不会失败,需要自己实现锁
问题四,不会有死锁
                            
查看完整回答
反对 回复 2019-03-29
  • 2 回答
  • 0 关注
  • 391 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信