Rya*_* Li 6 mysql innodb locking
trx1从refId = 4的表中选择*以进行更新
trx2插入表(refId)值(2); 块
trx2将被阻止,我知道trx1将保持间隙锁定,[1,4),[4,7);
我的问题是为什么要保持差距锁定?“插入val 2”与“选择refId = 4进行更新”没有冲突,为什么innodb将保持间隙锁定,为什么不使用记录锁定?
这个问题困扰了我很长时间,请科技上帝救救我。
小智 1
有趣的问题。
需要间隙锁来避免幻象行。MySQL 默认工作在 REPEATABLE-READ 隔离级别。select ... for update如果您在事务中运行多次,它应该始终返回相同的结果。假设您没有间隙锁,并且 trx2 插入了 refId=4 的另一行(索引不唯一)。然后在 trx1 中执行以下 select 将返回两行:
MariaDB [test]> select * from t1 where refId=4 for update;
+----+------+
| id | refId|
+----+------+
| 2 | 4 |
| 4 | 4 |
+----+------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
这与第一次选择的结果不同。