一次诡异的数据库“死锁”,问题究竟在哪里?
| 程序死锁的问题,很难调试,看进程堆栈,看各个线程与锁的情况,对照代码进行排查。 数据库死锁的问题,更难,看不了数据库堆栈,也看不了数据库线程与锁,更难以对照代码排查。 
 前段时间,和一个朋友讨论了一个“疑似”数据库死锁的问题,最后进行试验与排查,找到了问题所在。 场景如下: 
 同一个表,高并发事务,事务内先插入一条记录,再更新这条记录: 
 画外音:先不要被“dead lock”描述所迷惑,是死锁问题,阻塞问题,还是其他异常,还另说。 
 而且,据朋友所述,还能够复现: 
 在并发时稳定复现。 根据朋友的描述,在线下开了多个MySQL客户端进行了并发模式测试,结果还挺出乎意料的。 第一步:数据准备 
 新建表: 
 
 插入一些测试数据。 第二步:session参数设置 事务的隔离级别,事务的自动提交等参数设置不当,都会对实验的结果产生影响,询问了朋友,事务的隔离级别是RR(repeatable read)。 
 每一个session启动后: 
 
 
 不放心的话,可以用上面两个语句查询确认。 第三步:多个终端session模拟并发事务 
 如上图,用SecureCRT开启两个窗口: 
 奇怪的现象发生了,如果并发事务的update语句: 
 按道理,插入不冲突的记录,然后修改这条记录,行锁不应该冲突呀?唯一索引,主键索引怎么会有差异呢?是否有关?是死锁,还是其他原因? 大家帮忙分析分析,到底问题在哪里呢? 【本文为51CTO专栏作者“58沈剑”原创稿件,转载请联系原作者】 
 戳这里,看该作者更多好文 【编辑推荐】 
 点赞 0 (编辑:鹰潭站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 







