版本号机制和mysql的RR隔离级别有冲突吗?
我们都知道mysql数据库有四个事务隔离级别,第三种是 REPEATABLE READ(mysql的默认隔离级别),在这种隔离级别下,当前事务无法读到,当前事务开启之后数据库数据的变化。这很好的解决了第二种事务隔离级别的不可重复读的问题。
在多进程并发的场景下,我们为了解决多个进程同时修改同一条数据,造成的混乱问题,我们常常使用乐观锁,乐观锁常见的实现方式之一是采用版本号机制。
1.这种机制是在某个具体的表中多加一个version字段。当某个进程修改这条数据时,都会给version字段加一个1。
2.在修改提交时会校验当前的version字段是否大于数据库中数据的version字段,如果是则提交修改,如果不是则不提交当前修改。
基于上面的背景,我有一个疑惑。
在mysql的默认隔离级别RR下,在事务提交之前,是无法感知到事务开启之后数据库的变化的。也就是说这种情况下,即使别的事务修改并提交了这个这条数据,version也加1了,当前的事务也是无法感知到的。那么自然也无法校验当前version是否大于数据库里的字段version了。
所以我不太清楚版本号机制如何在mysql的RR隔离级别中实现。
请前辈们指导一下。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
事务里面 version + 1 的时候,会把记录锁住;
这时候在事务外面更新的那条 sql 会锁住,一直等到事务提交了,才执行。执行的时候就会发现 version 变化了