最近在学习MVCC相关的知识,碰到个问题,请问各位大佬,mysql在RR隔离级别下有MVCC,那还有共享锁(S Lock)吗?感觉MVCC完全可以替代共享锁,在读的时候只看版本号,都不需要加读锁了。
甚者,innodb如果查询字段使用上了索引,有MVCC的话,那还会有使用上行级锁吗?
最近在学习MVCC相关的知识,碰到个问题,请问各位大佬,mysql在RR隔离级别下有MVCC,那还有共享锁(S Lock)吗?感觉MVCC完全可以替代共享锁,在读的时候只看版本号,都不需要加读锁了。
甚者,innodb如果查询字段使用上了索引,有MVCC的话,那还会有使用上行级锁吗?
共享锁还是存在的哦,在mysql5.6 innodb,RR隔离级别中。
使用主键索引去查询一条不存在的数据,就会加上s锁了。
你可以试一下:
开启两个事务用主键查询同一条不存在数据(使用select ... for update)。
两个事务都会返回一个空结果。
此时,两个事务无论是谁都没办法以这个主键insert数据。
4 回答1.3k 阅读✓ 已解决
8 回答1.2k 阅读
3 回答1k 阅读✓ 已解决
2 回答1.7k 阅读
2 回答1.2k 阅读
1 回答856 阅读✓ 已解决
1 回答650 阅读✓ 已解决
对于具备多版本控制能力的数据库引擎确实不需要对表的读取加锁, MVCC能保障读取的完整性. MVCC 仅于单行(或单个字段)起作用, 锁可以实现多行多表多操作的事务锁定. 锁用途和 MVCC 是不太一样的, 可以说事务的实现依赖于 MVCC 特性, 但事务要比 MVCC 本身复杂得多. 如果不希望在读取时记录被修改, 锁才是唯一可行的.