版本号机制和mysql的RR隔离级别有冲突吗?

colorcotton1776
  • 52

我们都知道mysql数据库有四个事务隔离级别,第三种是 REPEATABLE READ(mysql的默认隔离级别),在这种隔离级别下,当前事务无法读到,当前事务开启之后数据库数据的变化。这很好的解决了第二种事务隔离级别的不可重复读的问题。

在多进程并发的场景下,我们为了解决多个进程同时修改同一条数据,造成的混乱问题,我们常常使用乐观锁,乐观锁常见的实现方式之一是采用版本号机制。
1.这种机制是在某个具体的表中多加一个version字段。当某个进程修改这条数据时,都会给version字段加一个1。
2.在修改提交时会校验当前的version字段是否大于数据库中数据的version字段,如果是则提交修改,如果不是则不提交当前修改。

基于上面的背景,我有一个疑惑。
在mysql的默认隔离级别RR下,在事务提交之前,是无法感知到事务开启之后数据库的变化的。也就是说这种情况下,即使别的事务修改并提交了这个这条数据,version也加1了,当前的事务也是无法感知到的。那么自然也无法校验当前version是否大于数据库里的字段version了。
所以我不太清楚版本号机制如何在mysql的RR隔离级别中实现。
请前辈们指导一下。

回复
阅读 1.8k
1 个回答

事务里面 version + 1 的时候,会把记录锁住;
这时候在事务外面更新的那条 sql 会锁住,一直等到事务提交了,才执行。执行的时候就会发现 version 变化了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏