关于 MySQL 中 InnoDB 事务锁的一些理解
InnoDB 行锁
参考 MySQL · 引擎特性 · InnoDB 事务锁系统简介
Locks Set by Different SQL Statements in InnoDB
区间锁(LOCK_GAP)
锁住一段范围,不锁记录本身,通常表示两个索引记录之间,或者索引上的第一条记录之前,或者最后一条记录之后的锁。一般在 RR 隔离级别下会使用。
Next-Key 锁(LOCK_ORDINARY)
其实就是锁住 待插入记录本身 + 记录之前的 GAP,Next-Key 锁用于解决 RR 隔离级别下的幻读问题。
通常对于 UPDATE 或 DELETE 或 SELECT … FOR UPDATE 或 SELECT … IN SHARE MODE 操作:
- 查询条件为唯一索引且是唯一等值查询时,只对记录本身加锁
- 非唯一条件查询,或者查询会扫描到多条记录,加 Next-Key 锁
关于 MySQL 中 InnoDB 的 MVCC 的一些理解
在 MySQL 中 InnoDB 的 MVCC 实现机制是给每行记录增加三个隐藏字段:
- 6 字节的 DB_TRX_ID,用于记录最近一次插入或更新的事务标示。删除也是一种更新,用一个特殊的字节表示该行已删除。
- 7 字节的 DB_ROLL_PTR,回滚指针,指向 undo log 记录。
- 6 字节的 DB_ROW_ID,自增长的 row ID。
参考:InnoDB Multi-Versioning
Copyright © 2015 Powered by MWeb, Theme used GitHub CSS.