社区编辑申请
注册/登录
一次诡异的数据库“死锁”,问题究竟在哪里?
开发 开发工具 数据库运维
前段时间,和一个朋友讨论了一个“疑似”数据库死锁的问题,最后进行试验与排查,找到了问题所在。

程序死锁的问题,很难调试,看进程堆栈,看各个线程与锁的情况,对照代码进行排查。

数据库死锁的问题,更难,看不了数据库堆栈,也看不了数据库线程与锁,更难以对照代码排查。

数据库/死锁/堆栈

前段时间,和一个朋友讨论了一个“疑似”数据库死锁的问题,最后进行试验与排查,找到了问题所在。

场景如下:

同一个表,高并发事务,事务内先插入一条记录,再更新这条记录:

  • 如果更新的是唯一索引,有异常;
  • 如果更新的是自增主键,就没有异常;

画外音:先不要被“dead lock”描述所迷惑,是死锁问题,阻塞问题,还是其他异常,还另说。

而且,据朋友所述,还能够复现:

  • 开启事务;
  • 插入记录;
  • sleep 5秒;
  • 修改被插入的记录;

在并发时稳定复现。

根据朋友的描述,在线下开了多个MySQL客户端进行了并发模式测试,结果还挺出乎意料的。

第一步:数据准备

  1. create table t ( 
  2. id int(20) primary key AUTO_INCREMENT, 
  3. cell varchar(20) unique 
  4. )engine=innodb

新建表:

  • 存储引擎是innodb,MySQL版本是5.6;
  • id字段,自增主键;
  • cell字段,唯一索引;
  1. start transaction; 
  2. insert into t(cell) values(11111111111); 
  3. insert into t(cell) values(22222222222); 
  4. insert into t(cell) values(33333333333); 
  5. commit; 

插入一些测试数据。

第二步:session参数设置

事务的隔离级别,事务的自动提交等参数设置不当,都会对实验的结果产生影响,询问了朋友,事务的隔离级别是RR(repeatable read)。

  1. set session autocommit=0
  2. set session transaction isolation level repeatable read; 

每一个session启动后:

  • 关闭自动提交;
  • 把事务隔离级别设为RR;

  1. show session variables like "autocommit"; 
  2. show session variables like "tx_isolation"; 

不放心的话,可以用上面两个语句查询确认。

第三步:多个终端session模拟并发事务

如上图,用SecureCRT开启两个窗口:

  • 窗口A,先启动事务,并插入记录;
  • 窗口B,再启动事务,也插入记录;
  • 窗口A,修改插入的记录;
  • 窗口B,也修改插入的记录;

奇怪的现象发生了,如果并发事务的update语句:

  • 更新条件是cell,就会发生异常;
  • 更新条件是id,就一切正常;

按道理,插入不冲突的记录,然后修改这条记录,行锁不应该冲突呀?唯一索引,主键索引怎么会有差异呢?是否有关?是死锁,还是其他原因?

大家帮忙分析分析,到底问题在哪里呢?

【本文为51CTO专栏作者“58沈剑”原创稿件,转载请联系原作者】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2019-04-15 13:15:12

数据库MySQL死锁

2017-06-14 22:11:57

数据库MySQL死锁

2022-03-29 10:52:08

MySQL数据库

2019-03-15 16:20:45

MySQL死锁排查命令

2009-03-30 10:56:58

2019-05-13 08:24:58

2017-12-19 14:00:16

数据库MySQL死锁排查

2021-06-08 08:38:36

MySQL数据库死锁问题

2020-12-08 09:25:41

死锁MySQL数据库

2019-12-27 10:43:48

2018-10-16 16:00:39

数据库锁舞MySQL

2021-10-20 20:27:55

2014-03-17 10:34:48

SQL Server

2022-07-05 11:48:47

2010-04-29 17:46:31

Oracle死锁

2010-11-18 16:58:33

Oracle死锁

2017-05-03 16:26:24

2020-07-16 21:20:08

数据库MySQL死锁

2020-04-14 10:20:12

2022-05-01 10:00:23

数据库MySQL

同话题下的热门内容

分布式锁工具:RedissonNuclei 进阶—深入理解 Workflows、Matchers 和 ExtractorsPython包管理工具之 PDM面试官:CyclicBarrier有了解过吗?聊聊免费好用的编程工具Web UI 自动化时,通过 AutoIT 的解决 Windows 控件GitHub 添加工具以简化软件开发管理用 Antlr 重构脚本解释器

编辑推荐

终于有人把Elasticsearch原理讲透了!花了一个星期,我终于把RPC框架整明白了!这可能是把ZooKeeper概念讲的最清楚的一篇文章论如何下载一个在线的m3u8文件到本地成为一个mp4!拜托!面试不要再问我Spring Cloud底层原理
我收藏的内容
点赞
收藏

AISummit人工智能大会