数据库 - Mysql事务隔离级别与乐观锁的问题
黄舟
黄舟 2017-04-17 11:32:14
[MySQL讨论组]

问题一:
当事务隔离级别设置为可重复读的时候,将所有select过的行都加了读锁,并且记录了版本号,当update 的时候们如果发现版本号变了,则事务失败回滚。不知道我这样理解是否正确?

问题二:
如果上面的理解正确,那是否innodb的可重复读这个隔离级别已经帮我们实现了乐观锁,所以并不需要手动通过版本或者时间戳来实现乐观锁,或者使用 悲观锁了?

问题三:
悲观锁 select ... for update 是增加了一个写锁? 所以所有的读写都会被block住?

问题四:
假设有事务A,先select 然后 update,事务B同样也是先select 然后再update
如果事务隔离级别为可重复读,事务A,B先后select加上了读锁,那么会不会因此而后面的update操作会互相block住,导致死锁?

问题一和问题四好像是矛盾的,因为如果问题四成立,事务会block住,也不会修改成功导致版本号不一致导致 回滚了。

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(1)
伊谢尔伦

这个问题有些复杂,根据事务隔离的定义,可重复读是需要上读锁的:
wiki中文说明
wiki英文说明
也就是保证读取的内容不会发生改变。

但根据mysql的文档,innodb的实现机制是在读的时候,建立快照,以保证在单个事务内,读取的内容不会发生变化:mysql文档

那么就是产生了一些微妙的区别。。。虽然对结果来说没区别=。=
问题一二如同@Huan Du所说,没读锁所以不会失败,需要自己实现锁
问题四,不会有死锁

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号