掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
程序死鎖的問題,很難調(diào)試,看進程堆棧,看各個線程與鎖的情況,對照代碼進行排查。

創(chuàng)新互聯(lián)公司專注于網(wǎng)站建設(shè)|成都網(wǎng)站維護公司|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計與制作經(jīng)驗,為許多企業(yè)提供了網(wǎng)站定制設(shè)計服務(wù),案例作品覆蓋成都航空箱等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷售的產(chǎn)品,結(jié)合品牌形象的塑造,量身策劃品質(zhì)網(wǎng)站。
數(shù)據(jù)庫死鎖的問題,更難,看不了數(shù)據(jù)庫堆棧,也看不了數(shù)據(jù)庫線程與鎖,更難以對照代碼排查。
前段時間,和一個朋友討論了一個“疑似”數(shù)據(jù)庫死鎖的問題,最后進行試驗與排查,找到了問題所在。
場景如下:
同一個表,高并發(fā)事務(wù),事務(wù)內(nèi)先插入一條記錄,再更新這條記錄:
畫外音:先不要被“dead lock”描述所迷惑,是死鎖問題,阻塞問題,還是其他異常,還另說。
而且,據(jù)朋友所述,還能夠復(fù)現(xiàn):
在并發(fā)時穩(wěn)定復(fù)現(xiàn)。
根據(jù)朋友的描述,在線下開了多個MySQL客戶端進行了并發(fā)模式測試,結(jié)果還挺出乎意料的。
第一步:數(shù)據(jù)準備
- 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;
插入一些測試數(shù)據(jù)。
第二步:session參數(shù)設(shè)置
事務(wù)的隔離級別,事務(wù)的自動提交等參數(shù)設(shè)置不當,都會對實驗的結(jié)果產(chǎn)生影響,詢問了朋友,事務(wù)的隔離級別是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模擬并發(fā)事務(wù)
如上圖,用SecureCRT開啟兩個窗口:
奇怪的現(xiàn)象發(fā)生了,如果并發(fā)事務(wù)的update語句:
按道理,插入不沖突的記錄,然后修改這條記錄,行鎖不應(yīng)該沖突呀?唯一索引,主鍵索引怎么會有差異呢?是否有關(guān)?是死鎖,還是其他原因?
大家?guī)兔Ψ治龇治?,到底問題在哪里呢?
【本文為專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流