mysql unique 锁_MySQL唯一键死锁总结分析

[TOC]

1、没有锁CASE

# 8.0.18

# RC

CREATE TABLE `t3` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL,

`age` int(11) NOT NULL DEFAULT '1',

PRIMARY KEY (`id`)

) ENGINE=InnoDB

68fbf0347ceb9f263cb3669117b04dd2.png

2、唯一键死锁CASE1

# 8.0.18

# RC

CREATE TABLE `t2` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL,

`age` int(11) NOT NULL DEFAULT '1',

PRIMARY KEY (`id`),

UNIQUE KEY `udx_name` (`name`),

KEY `idx_name` (`name`)

) ENGINE=InnoDB

a51e7e9e4db33fa9c9e32f7c659250f2.png

死锁产生的原因是:

S1对(2,2)记录加X锁,

S2/S3需要唯一键冲突检测,需要加S锁,由于X锁的存在,S锁的获取被阻塞。

S1提交或者回滚,因为S锁兼容,S2/S3都获得S锁,都希望得到X锁,发生死锁。

为什么S2/S3要加S锁,而不是直接等待X锁

S2/S3 在插入之前判断到了唯一键冲突,当前读模式

3、唯一键死锁CASE2

# 隔离级别RC

# 版本8.0.18

CREATE TABLE `t1` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`name` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL,

`age` int(11) DEFAULT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `name` (`name`)

) ENGINE=InnoDB

insert into t1 select 1,'a',1;

56fa97ba46ed2b30c2d1fb6c8fa1e79c.png

事务 1 持有uk_name 唯一索引上的 S 锁(共享锁) 事务 1 想获取 uk_name 唯一索引上的 X 锁 (非 gap 锁的记录锁) 事务 2 持有uk_name 唯一索引上的 S 锁(共享锁) 事务 2 想获得 uk_name 唯一索引上的 X 锁(非 gap 锁的记录锁)

4、唯一键死锁CASE3

# 隔离级别RC

# 版本8.0.18

CREATE TABLE `t1` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`name` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL,

`age` int(11) DEFAULT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `name` (`name`)

) ENGINE=InnoDB;

insert into t1 select 1,'a',1;

c7337571350fb57c3bc0d2ecc604fb08.png

show engine innodb status S2 HOLDS THE LOCK(S),WAITING FOR lock_mode X S1 HOLDS THE LOCK(S): WAITING FOR lock_mode X

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值