再谈 MySQL InnoDB 可重复读级别下的锁

InnoDB 是 MySQL 默认的数据库存储引擎, 由于其良好的性能和对事务的支持, InnoDB 也是大多数业务场景下开发者的首选. 可重复读(Repeatable Read)作为 InnoDB 默认的事务隔离级别, InnoDB 研发团队对其进行了大量的设计和优化. 当理解了 InnoDB 在可重复读级别下的事务隔离机制后, 再理解数据库在其他隔离级别下的表现也就容易多了. 作为开发者, 只有当理解了这些设计背后的思想, 才不会在遇到问题时手忙脚乱. InnoDB RR 隔离级别的实现原理 事务的隔离级别是当存在多个事务同时操作相同数据时, 对事务之间相互影响的要求标准. 可重复读的事务隔离级别要求: 在事务A开启事务之后, 事务B对数据的修改就不再对A可见了. InnoDB 采用了多版本并发控制(Multi-Version Concurrency Control)和两段锁协议(2-Phase-Lock)相结合的技术方案实现了 可重复读 的并发事务管理. 在可重复读的隔离级别下, InnoDB 会在每个事务提交时记录下当前事务的版本号, 并将此变更的记录与变更数据的历史版本相关联. 某事务对数据进行查询时只能查到数据版本 <= 当前事务版本的数据状态. 在事务执行期间, 当事务 A…