跳至主要內容

死锁分析

博识笔记小于 1 分钟notemysql

死锁分析

create table `order` (
  id int not null auto_increment,
  order_no int default null,
  create_date datetime default null,
  primary key (id),
  key idx_order (order_no)
) ENGINE=InnoDB ;

事务A

begin;
-- step 1 :查询订单 1007 是否存在
select * from order where order_no = 1007 for update;
-- step 4:若没有,插入订单记录
insert into order(order_no, create_date) values(1007, now());
-- 阻塞 ...

事务B

begin;
-- step 2 :查询订单 1008 是否存在
select * from order where order_no = 1008 for update;
-- step 3:若没有,插入订单记录
insert into order(order_no, create_date) values(1008, now());
-- 阻塞 ...

分析:

按照加锁原则,事务 A 会加间隙锁,同样事务 B 也会加间隙锁
在插入时会尝试先获取插入意向锁,获取失败阻塞等待
间隙锁无论是 S 型还是 X 型没什么区别,二者兼容,两个事务的间隙锁之间是相互兼容的