毫不夸张的说,有一半以上的死锁问题由唯一索引贡献,后面介绍的很多死锁的问题都跟唯一索引有关。这次我们讲一段唯一索引 S 锁与 X 锁的爱恨情仇

我们来看一个简化过的例子

# 构造数据

CREATE TABLE `t1` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(10),

`level` int(11),

PRIMARY KEY (`id`),

UNIQUE KEY `uk_name` (`name`)

);

INSERT INTO `t1` (`name`, `level`) VALUES ('A',0);

# 出现问题的sql语句如下,并发情况下就会出现死锁

INSERT ignore INTO `t1` (`name`, `level`) VALUES ('A',0);

update t1 set level = 1 where name = "A";

我们用之前介绍过的源码分析方式,先来看下这两条语句分别加什么锁,然后分析死锁形成的过程。

第一条语句

INSERT ignore INTO t1 (name, level) VALUES ('A',0);

在调试中得到的结果如下

可以看到这条语句对唯一键 uk_name 加共享锁(S锁),而且成功。

第二条语句

update t1 set level = 1 where name = "A"; 通过唯一键更新数据库字段。

这种情况在之前的文章已经介绍过,会对唯一索引加 X 锁,然后对主键索引加 X 锁

这样就可以非常轻松的复现死锁的问题了,步骤如下

开启两个 session,分别 begin

session1 执行INSERT ignore INTO t1 (name, level) VALUES ('A',0);

session2 执行INSERT ignore INTO t1 (name, level) VALUES ('A',0);

session1 执行update t1 set level = 1 where name = "A"; 进入等待状态

session2 执行update t1 set level = 1 where name = "A";,死锁产生,被回滚,同时事务 1 执行成功

详细的锁状态变化如下

t1

t2

备注

INSERT IGNORE INTO

-

t1成功获得uk的S锁 DB_SUCCESS

-

INSERT IGNORE INTO

t2成功获得uk的S锁 DB_SUCCESS

UPDATE

-

t1尝试获得uk的X锁,但没有成功,处于等待状态 DB_LOCK_WAIT

-

UPDATE

t2尝试获得uk的X锁,发现死锁产生 DB_DEADLOCK

-

Deadlock

t2释放S锁

成功

-

-

死锁日志如下:

mysql 唯一索引 死锁_MySQL 死锁套路:唯一索引 S 锁与 X 锁的爱恨情仇相关推荐

  1. mysql insert s锁_MySQL 死锁套路:唯一索引 S 锁与 X 锁的爱恨情仇

    在初学者从源码理解MySQL死锁问题中介绍了使用调试 MySQL  源码的方式来查看死锁的过程,这篇文章来讲讲一个常见的案例. 毫不夸张的说,有一半以上的死锁问题由唯一索引贡献,后面介绍的很多死锁的问 ...

  2. mysql数据库批量插数死锁_MySQL 死锁套路:一次诡异的批量插入死锁问题分析

    线上最近出现了批量insert的死锁,百思不得姐.死锁记录如下 2018-10-26T11:04:41.759589Z 8530809 [Note] InnoDB: *** (1) TRANSACTI ...

  3. mysql两列唯一索引吗_mysql多字段唯一索引

    项目中需要用到联合唯一索引: 例如:有以下需求:每个人每一天只有可能产生一条记录:处了程序约定之外,数据库本身也可以设定: 例如:user表中有userID,userName两个字段,如果不希望有2条 ...

  4. 如何判断mysql死锁_MySQL 死锁问题分析

    线上某服务时不时报出如下异常(大约一天二十多次):"Deadlock found when trying to get lock;". Oh, My God! 是死锁问题.尽管报错 ...

  5. mysql取消死锁_mysql 死锁可以自动解除吗

    1. session1 执行 delete  会在唯一索引 c2 的 c2 = 15 这一记录上加 X lock(也就是在MySQL 内部观测到的:X Lock but not gap): 2. se ...

  6. mysql常见死锁_MySQL死锁系列-常见加锁场景分析

    如下图所示,数据库的隔离等级,SQL 语句和当前数据库数据会共同影响该条 SQL 执行时数据库生成的锁模式,锁类型和锁数量. 下面,我们会首先讲解一下隔离等级.不同 SQL 语句 和 当前数据库数据对 ...

  7. mysql先删后增并发时出现死锁_MySQL死锁案例分析一(先delete,再insert,导致死锁)...

    一.死锁案例 MySQL版本:Percona MySQL Server 5.7.19 隔离级别:可重复读(RR) 业务逻辑:并发下按某个索引字段先delete记录,再insert记录 比如:begin ...

  8. 重启 mysql死锁_MySQL死锁导致无法查询的问题

    之前从来没有遇到过mysql死锁的问题,今天第一次,查看了很多博客,问题终于解决啦,在此特意记录和分享. 1.第一种方式:重启MySQL 因为MySQL的事务产生了死锁,刚开始我是直接重启MySQL, ...

  9. mysql 字符串索引 优化_MySQL性能优化之索引调优实战

    索引失效场景或使用注意事项 a.索引无法存储null值,所以建议都给默认值 b.如果条件中有or,即使使用了索引条件也不起作用,所以尽量少用or 如果想使用or,又让索引生效,只能将or的每个列上加上 ...

最新文章

  1. 【解决方案】分布式定时任务解决方案
  2. RansomCoin 二进制中提取加密货币地址
  3. 包头昆区多大面积_两套楼房,放了整整19车垃圾!包头这对母女的“特殊癖好”,让邻居彻底不能忍了.........
  4. 使用Managed DirectX编写游戏
  5. 排序算法之希尔排序(Java)
  6. 删除变量PHP之session的使用
  7. 【华为云技术分享】三大前端技术(React,Vue,Angular)探密(上)
  8. NetScaler通过DHCP服务器获取IP地址
  9. mutations vuex 调用_Vuex源码解析
  10. JQuery - Ajax和Tomcat跨域请求问题解决方法!
  11. Linux知识体系之路径属性与目录
  12. Jmeter使用教程(图文并茂)|实战干货
  13. Python 在问答频道中刷题积累到的小技巧(二)
  14. CSP漫画工作室clipstudiopaint最新版本2022功能介绍
  15. poi 读取word文字图片表格
  16. 麦麦本重装win10无限自动关机,甚至pe进去后都自动关机问题
  17. 雷神轮胎携手JBL 演绎科技降噪、感受非凡音悦
  18. 俄罗斯电商平台ozon的崛起,卖家可以使用测评补单方式打造爆款吗?
  19. 商业Web应用程序的用户界面设计
  20. 写下来回头看,在游戏中隐藏线程思路r3

热门文章

  1. JBoss BRMS与JasperReports进行报告
  2. Java最佳实践–高性能序列化
  3. simulink怎么生成vxworks的执行程序_从EPB模型谈谈Simulink代码生成
  4. Linux 命令行中的文件名/文件路径中使用通配符的说明
  5. SublimeText如何让代码的关键字高亮显示
  6. mysql管理节点_MySql节点管理安装步骤需要在SerA和SerB上各做一次
  7. python程序怎么给别人运行_如何使Python脚本作为服务运行?
  8. php中的ol标签,html5中ol标签的用法详解
  9. ibm服务器芯片架构,IBM x366 服务器技术详解
  10. java用户名检查数据库_登入界面账号密码是访问数据库,但登入问题时if判断时就是执行不了...