Purge死锁
场景说明
Purge死锁说明
表中存在记录(unique key) 10,20,30,40 (且有 自增主键 ),现在删除记录 20 ,并且已经 提交 了该事物。 purge 线程此时还 没有回收 该记录,且此时又 插入 新的记录 20 。
+------+------+------+------+
orignal | 10 | 20 | 30 | 40 |
unique +------+------+------+------+
delete 20 +------+------+------+------+
| 10 | 20* | 30 | 40 | (20 : delete-mark)
and commit +------+^----^+------+------+
| |
non happen | +--insert new 20
|
Purge
# 自增主键图中没有给出
回顾插入过程 完整的插入过程如下:
假设现在有记录 10,30,50,70 ;且为 unique key ,需要插入记录 25 。
1. 找到 小于等于25的记录 ,这里是 10
如果记录中已经 存在记录25 ,且带有 唯一性约束 ,则需要在 记录25 上增加 S Gap-lock (purge的案例中,老 记录20* 要加S lock的原因)
不直接报错退出或者提示已存在的原因,是因为有可能之前的 记录25 标记为删除( delete-mark ),然后等待 purge
如果 假设 这里 没有S Gap-Lock ,此时 记录30 上也 没有锁 的,按照下面的步骤,可以插入 两个25 ,这样就 破坏了唯一性约束
2. 找到 记录10的下一条记录 ,这里是 30
3. 判断 下一条记录30 上是否有锁(如果有=25的情况,后面再讨论)
判断 30 上面如果 没有锁 ,则 可以插入
判断 30 上面如果有 Record Lock ,则 可以插入
判断 30 上面如果有 Gap Lock / Next-Key Lock ,