来自hollis八股文
流程图
前置知识
数据库上锁锁住的不是行,而是索引的主键
比如我对id = 1的主键进行上锁,实际上是对查询使用的主键的key = 1 进行上锁
对非聚簇索引操作时,首先会对非聚簇索引上锁,然后在请求主键的锁
比如我使用聚簇索引修改数据,首先锁住聚簇索引的key,在锁住主键的key
接下来介绍场景
transno索引是前缀索引
id 是聚簇索引
当ab事务操作transno的前缀为相同时,会造成锁冲突
事务a 锁住id = 1
事务b 锁住id = 2
事务a 锁住transno = 3,请求id = 2 失败此时id = 2 被b线程占有
事务b 请求 transno = 3 失败此时 transno 被线程a占有
此时ab事务死锁了
a线程占有 id1、transno3 请求id2
b线程占有 id2、请求transno3
解决方案
所有的update都锁主键