mysql在RR隔离级别下有MVCC,那还有共享锁吗?

最近在学习MVCC相关的知识,碰到个问题,请问各位大佬,mysql在RR隔离级别下有MVCC,那还有共享锁(S Lock)吗?感觉MVCC完全可以替代共享锁,在读的时候只看版本号,都不需要加读锁了。

甚者,innodb如果查询字段使用上了索引,有MVCC的话,那还会有使用上行级锁吗?

阅读 3.3k
2 个回答

对于具备多版本控制能力的数据库引擎确实不需要对表的读取加锁, MVCC能保障读取的完整性. MVCC 仅于单行(或单个字段)起作用, 锁可以实现多行多表多操作的事务锁定. 锁用途和 MVCC 是不太一样的, 可以说事务的实现依赖于 MVCC 特性, 但事务要比 MVCC 本身复杂得多. 如果不希望在读取时记录被修改, 锁才是唯一可行的.

新手上路,请多包涵

共享锁还是存在的哦,在mysql5.6 innodb,RR隔离级别中。
使用主键索引去查询一条不存在的数据,就会加上s锁了。
你可以试一下:
开启两个事务用主键查询同一条不存在数据(使用select ... for update)。
两个事务都会返回一个空结果。
此时,两个事务无论是谁都没办法以这个主键insert数据。

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