http://hedengcheng.com/?p=844 by何登成(这篇博客提到了一个无比微妙的死锁情况,涉及InnoDB死锁预防。)
这篇文章从一个简单的SQL语句delete from t1 where id = 10;,分析在各种情况下的加锁情况。以下为这篇文章的目录,感谢何博士的分享。
1 背景 1
1.1 MVCC:Snapshot Read vs Current Read 2
1.2 Cluster Index:聚簇索引 3
1.3 2PL:Two-Phase Locking 3
1.4 Isolation Level 4
2 一条简单SQL的加锁实现分析 5
2.1 组合一:id主键+RC 6记录X锁
2.2 组合二:id唯一索引+RC 6唯一索引X锁+对应记录X锁
2.3 组合三:id非唯一索引+RC 7多个(索引X锁+对应记录X锁)
2.4 组合四:id无索引+RC 8全记录X锁
2.5 组合五:id主键+RR 9记录X锁
2.6 组合六:id唯一索引+RR 9唯一索引X锁+对应记录X锁
2.7 组合七:id非唯一索引+RR 9多个(索引X锁+对应记录X锁)+多个索引Gap锁
2.8 组合八:id无索引+RR 11 全纪录X锁,全Gap锁
2.9 组合九:Serializable 12MVCC降级为Lock-based并发控制
3 一条复杂的SQL 12
4 死锁原理与分析 14
5 总结 16
总结部分:
1、了解数据库的一些基本理论知识:数据的存储格式 (堆组织表 vs 聚簇索引表);并发控制协议 (MVCC vs Lock-Based CC);Two-Phase Locking;数据库的隔离级别定义 (Isolation Level); 2、了解SQL本身的执行计划 (主键扫描 vs 唯一键扫描 vs 范围扫描 vs 全表扫描); 3、了解数据库本身的一些实现细节 (过滤条件提取;Index Condition Pushdown;Semi-Consistent Read); 4、了解死锁产生的原因及分析的方法 (加锁顺序不一致;分析每个SQL的加锁顺序)。