自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一次詭異的數(shù)據(jù)庫(kù)“死鎖”,問(wèn)題究竟在哪里?

開(kāi)發(fā) 開(kāi)發(fā)工具 數(shù)據(jù)庫(kù)運(yùn)維
前段時(shí)間,和一個(gè)朋友討論了一個(gè)“疑似”數(shù)據(jù)庫(kù)死鎖的問(wèn)題,最后進(jìn)行試驗(yàn)與排查,找到了問(wèn)題所在。

程序死鎖的問(wèn)題,很難調(diào)試,看進(jìn)程堆棧,看各個(gè)線程與鎖的情況,對(duì)照代碼進(jìn)行排查。

數(shù)據(jù)庫(kù)死鎖的問(wèn)題,更難,看不了數(shù)據(jù)庫(kù)堆棧,也看不了數(shù)據(jù)庫(kù)線程與鎖,更難以對(duì)照代碼排查。

[[268389]]

前段時(shí)間,和一個(gè)朋友討論了一個(gè)“疑似”數(shù)據(jù)庫(kù)死鎖的問(wèn)題,最后進(jìn)行試驗(yàn)與排查,找到了問(wèn)題所在。

場(chǎng)景如下:

同一個(gè)表,高并發(fā)事務(wù),事務(wù)內(nèi)先插入一條記錄,再更新這條記錄:

  • 如果更新的是唯一索引,有異常;
  • 如果更新的是自增主鍵,就沒(méi)有異常;

畫(huà)外音:先不要被“dead lock”描述所迷惑,是死鎖問(wèn)題,阻塞問(wèn)題,還是其他異常,還另說(shuō)。

而且,據(jù)朋友所述,還能夠復(fù)現(xiàn):

  • 開(kāi)啟事務(wù);
  • 插入記錄;
  • sleep 5秒;
  • 修改被插入的記錄;

在并發(fā)時(shí)穩(wěn)定復(fù)現(xiàn)。

根據(jù)朋友的描述,在線下開(kāi)了多個(gè)MySQL客戶端進(jìn)行了并發(fā)模式測(cè)試,結(jié)果還挺出乎意料的。

第一步:數(shù)據(jù)準(zhǔn)備

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

新建表:

  • 存儲(chǔ)引擎是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; 

插入一些測(cè)試數(shù)據(jù)。

第二步:session參數(shù)設(shè)置

事務(wù)的隔離級(jí)別,事務(wù)的自動(dòng)提交等參數(shù)設(shè)置不當(dāng),都會(huì)對(duì)實(shí)驗(yàn)的結(jié)果產(chǎn)生影響,詢問(wèn)了朋友,事務(wù)的隔離級(jí)別是RR(repeatable read)。

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

每一個(gè)session啟動(dòng)后:

  • 關(guān)閉自動(dòng)提交;
  • 把事務(wù)隔離級(jí)別設(shè)為RR;

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

不放心的話,可以用上面兩個(gè)語(yǔ)句查詢確認(rèn)。

第三步:多個(gè)終端session模擬并發(fā)事務(wù)

如上圖,用SecureCRT開(kāi)啟兩個(gè)窗口:

  • 窗口A,先啟動(dòng)事務(wù),并插入記錄;
  • 窗口B,再啟動(dòng)事務(wù),也插入記錄;
  • 窗口A,修改插入的記錄;
  • 窗口B,也修改插入的記錄;

奇怪的現(xiàn)象發(fā)生了,如果并發(fā)事務(wù)的update語(yǔ)句:

  • 更新條件是cell,就會(huì)發(fā)生異常;
  • 更新條件是id,就一切正常;

按道理,插入不沖突的記錄,然后修改這條記錄,行鎖不應(yīng)該沖突呀?唯一索引,主鍵索引怎么會(huì)有差異呢?是否有關(guān)?是死鎖,還是其他原因?

大家?guī)兔Ψ治龇治?,到底?wèn)題在哪里呢?

【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2019-04-15 13:15:12

數(shù)據(jù)庫(kù)MySQL死鎖

2019-12-05 09:13:18

通信

2011-07-14 13:10:44

負(fù)載均衡Nginx

2010-03-19 16:08:17

2024-01-08 08:59:40

傳統(tǒng)企業(yè)數(shù)字化癥結(jié)

2024-03-18 09:10:00

死鎖日志binlog

2021-10-14 10:53:20

數(shù)據(jù)庫(kù)查詢超時(shí)

2023-10-11 22:24:00

DubboRedis服務(wù)器

2021-12-01 07:26:13

領(lǐng)域驅(qū)動(dòng)建模

2013-11-08 00:45:40

國(guó)產(chǎn)數(shù)據(jù)庫(kù)

2017-03-14 14:09:08

數(shù)據(jù)庫(kù)Oracle備份

2013-10-08 09:54:41

數(shù)據(jù)庫(kù)安全數(shù)據(jù)庫(kù)管理

2023-11-29 12:12:24

Oceanbase數(shù)據(jù)庫(kù)

2018-07-20 08:44:21

Redis內(nèi)存排查

2011-04-13 09:21:30

死鎖SQL Server

2019-03-15 16:20:45

MySQL死鎖排查命令

2021-11-25 14:14:28

加密貨幣數(shù)字貨幣貨幣

2019-04-04 15:00:40

SQL索引數(shù)據(jù)庫(kù)

2018-12-06 16:25:39

數(shù)據(jù)庫(kù)服務(wù)器線程池

2021-01-18 08:08:16

虛函數(shù)代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)