【发布时间】:2021-11-02 08:51:58
【问题描述】:
MySQL中引入了几种锁,其中SELECT ... FROM为一致性读,读取数据的快照,不设置锁(除非事务级别为SERIALIZABLE)(https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html)
在 MySQL 中通过向元组添加标头(包括事务版本和指针)和逻辑可见性规则来实现快照(MVCC)
但我们一直强调可见性规则的设计原则,却忽略了对元组Header的读写是两个互斥的动作,只能通过加锁来避免。
那么consistent read without lock这句话怎么理解呢?只是没有广义上的锁吗? tuple Header 的原子读写是如何设计的?是否有任何性能开销?有没有这方面的资料?
-----补充说明-----
当更新行(元组)时,会保留该行的新版本以及旧副本。每个副本都有一个序列号(事务 id)。
事务ID和副本指针存储在行头中,即创建副本时需要修改行头(更新事务ID和副本指针)。访问行时,需要先访问行头来判断我们要访问的版本(位置)。
修改行头和访问行头应该是两个互斥的动作(否则在并发读写的情况下会读取脏数据),而我想知道的是MySQL执行这部分(行头)阅读和写作的逻辑是如何设计的?是读写锁/自旋锁还是有其他巧妙的方法?
【问题讨论】: