1.分类
1.1表锁
意向锁 IS ,IX
1.2 行锁
1.共享锁 S
2.排它锁 X
1.2.1细分
1.record锁
2.gap锁
3.next key 锁
相当于 record + gap
4.insert intention 锁
并非意向锁,而是一种特殊的gap锁。先持有的gap锁会block它
5.auto increament锁
2.锁流程
2.1插入
insert intention —> X record lock
2.2 更新
1.条件是唯一(主键或者unique key)
IX -> record lock (X)
2.条件非唯一
IX -> gpa lock (X)
3. 锁兼容矩阵
3.1 死锁分析
3.1.1 唯一键冲突导致的死锁
准备
表 user(id int,name varchar2(32)) unikey (name);
T 1: insert into user (id,name) values( 1,'sim')
T 2 : insert into user (id,name) values( 1,'sim')
T 3 : insert into user (id,name) values( 1,'sim')
T1 :rollback
当前锁状态
T1 持有 X 锁 T2 和T3会因为唯一建冲突退化成S
死锁分析
当X rollback 时,T2会抢X锁,当时发现 T3对记录加了S,所以会等T3释放S。
但是T3也是持有S,准备抢X。
3.1.2 select ...for update 和insert 导致的死锁
准备
表 user(id int,age int)
insert into values(1,10),(2,11),(3,13),(4,20)
T1 select * from user where age = 14 for update;
T2 select * from user where age = 15 for update;
T 1: insert into use values (5, 16);
T 2 : insert into use values (5, 16);
当前锁状态
T1 持有 gap 锁(13,20)
T 2持有gap锁(13,20)
死锁分析*
T1准备加 insert intention 锁,但是发现T2持有gap锁,等待T2释放gap锁。
同时T2也准备加 insert intention 锁,但是发现T1持有gap锁,等待T1释放gap锁。