MySQL 事务隔离级别实现原理

InnoDB 有两种读取数据的方式

  • 快照读/一致性读,MVCC
  • 当前读,获取读写锁后读取行的最新数据

InnoDB 用一致性读视图实现了 MVCC,用于支持读已提交和可重复读隔离级别的实现。

启动事务时立即创建视图

start transaction with consistent snapshot

快照读

快照读/MVCC

InnoDB 每个事务都有一个唯一的事务id,transaction id。
它是在事务开始的时候向 InnoDB 事务系统申请的,按申请顺序严格递增。

每次更新数据行时,InnoDB 会生成一个新的数据版本(undo log)并把 transaction id 赋值给这个数据版本的 row trx_id。

当前读

如果应用逻辑是查询后更新数据,应该使用当前读,否则快照读可能读到旧数据,造成客户端丢失更新。

更新语句和加锁的查询语句会使用当前读。

加读锁

select ... lock in share mode

加写锁

select ... for update
posted @ 2024-10-15 20:23  廖子博  阅读(8)  评论(0编辑  收藏  举报