程序死锁的问题,很难调试,看进程堆栈,看各个线程与锁的情况,对照代码进行排查。
创新互联公司专注于网站建设|成都网站维护公司|优化|托管以及网络推广,积累了大量的网站设计与制作经验,为许多企业提供了网站定制设计服务,案例作品覆盖成都航空箱等行业。能根据企业所处的行业与销售的产品,结合品牌形象的塑造,量身策划品质网站。
数据库死锁的问题,更难,看不了数据库堆栈,也看不了数据库线程与锁,更难以对照代码排查。
前段时间,和一个朋友讨论了一个“疑似”数据库死锁的问题,最后进行试验与排查,找到了问题所在。
场景如下:
同一个表,高并发事务,事务内先插入一条记录,再更新这条记录:
画外音:先不要被“dead lock”描述所迷惑,是死锁问题,阻塞问题,还是其他异常,还另说。
而且,据朋友所述,还能够复现:
在并发时稳定复现。
根据朋友的描述,在线下开了多个MySQL客户端进行了并发模式测试,结果还挺出乎意料的。
第一步:数据准备
- create table t (
- id int(20) primary key AUTO_INCREMENT,
- cell varchar(20) unique
- )engine=innodb;
新建表:
- start transaction;
- insert into t(cell) values(11111111111);
- insert into t(cell) values(22222222222);
- insert into t(cell) values(33333333333);
- commit;
插入一些测试数据。
第二步:session参数设置
事务的隔离级别,事务的自动提交等参数设置不当,都会对实验的结果产生影响,询问了朋友,事务的隔离级别是RR(repeatable read)。
- set session autocommit=0;
- set session transaction isolation level repeatable read;
每一个session启动后:
- show session variables like "autocommit";
- show session variables like "tx_isolation";
不放心的话,可以用上面两个语句查询确认。
第三步:多个终端session模拟并发事务
如上图,用SecureCRT开启两个窗口:
奇怪的现象发生了,如果并发事务的update语句:
按道理,插入不冲突的记录,然后修改这条记录,行锁不应该冲突呀?唯一索引,主键索引怎么会有差异呢?是否有关?是死锁,还是其他原因?
大家帮忙分析分析,到底问题在哪里呢?
【本文为专栏作者“58沈剑”原创稿件,转载请联系原作者】
网站标题:一次诡异的数据库“死锁”,问题究竟在哪里?
文章出自:http://www.shufengxianlan.com/qtweb/news18/59618.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联