mysql死锁回滚策略_MySQL 死锁套路:三个事务插入有一个回滚

本文通过一个经典的死锁案例,详细解释了MySQL中由于插入意向锁导致的死锁问题。在RC级别,当两个事务尝试在已存在唯一索引的表中插入相同数据时,会出现死锁。事务1先插入并持有X锁,事务2和3等待S锁。当事务1回滚后,事务2和3同时获取S锁并尝试升级为X锁,从而形成死锁。分析了死锁日志,揭示了插入意向锁在死锁中的角色。
摘要由CSDN通过智能技术生成

这个是非常经典的一个场景,在网上搜索插入意向锁造成的死锁,绝大部分都会指向这个例子

表结构

CREATE TABLE `t1` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`a` varchar(5),

`b` varchar(5),

PRIMARY KEY (`id`),

UNIQUE KEY `uk_name` (`a`,`b`)

);

复制代码

三个事务的 insert 语句都是 insert ignore into t1(a, b)values("1", "1");

复现步骤如下:

t1

t2

t3

备注

begin

begin

begin

insert

成功

insert

把 t1 的隐式锁提升为 X 锁,t2 进入进入 S 锁等待

insert

t3 进入进入 S 锁等待

rollback;

t1 回滚以后,释放 X 锁,t2 和 t3 同时拿到了 S 锁

ok

deadlock

t2 和 t3 都想拿插入意向锁 X 锁,造成死锁条件

死锁日志如下

------------------------

LATEST DETECTED DEADLOCK

------------------------

181101 23:22:59

*** (1) TRANSACTION:

TRANSACTION 5032, ACTIVE 11 sec inserting

mysql tables in use 1, locked 1

LOCK WAIT 4 lock struct(s), heap size 1248, 2 row lock(s), undo log entries 1

MySQL thread id 5, OS thread handle 0x70000d736000, query id 125 localhost root update

insert ignore into t1(a, b)values("1", "1")

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 56 page no 4 n bits 584 index `uk_name` of table `d1`.`t1` trx id 5032 lock_mode X locks gap before rec insert intention waiting

Record lock, heap no 139 PHYSICAL RECORD: n_fields 3; compact format; info bits 0

0: len 3; hex 313031; asc 101;;

1: len 3; hex 313031; asc 101;;

2: len 4; hex 800007b1; asc ;;

*** (2) TRANSACTION:

TRANSACTION 5033, ACTIVE 6 sec inserting

mysql tables in use 1, locked 1

4 lock struct(s), heap size 1248, 2 row lock(s), undo log entries 1

MySQL thread id 6, OS thread handle 0x70000d779000, query id 126 localhost root update

insert ignore into t1(a, b)values("1", "1")

*** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 56 page no 4 n bits 584 index `uk_name` of table `d1`.`t1` trx id 5033 lock mode S locks gap before rec

Record lock, heap no 139 PHYSICAL RECORD: n_fields 3; compact format; info bits 0

0: len 3; hex 313031; asc 101;;

1: len 3; hex 313031; asc 101;;

2: len 4; hex 800007b1; asc ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 56 page no 4 n bits 584 index `uk_name` of table `d1`.`t1` trx id 5033 lock_mode X locks gap before rec insert intention waiting

Record lock, heap no 139 PHYSICAL RECORD: n_fields 3; compact format; info bits 0

0: len 3; hex 313031; asc 101;;

1: len 3; hex 313031; asc 101;;

2: len 4; hex 800007b1; asc ;;

*** WE ROLL BACK TRANSACTION (2)

复制代码

这里我们第一次提到了插入意向锁(insert intention lock)

插入意向锁(insert intention lock)

对已有数据行的修改与删除,必须加强互斥锁 X 锁,那对于数据的插入,是否还需要加这么强的锁,来实施互斥呢?插入意向锁,孕育而生。

插入意向锁是间隙锁(Gap Locks)的一种,它是专门针对 insert 操作的,也是为数不多的在 RC 级别下产生 Gap 锁情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值