2019.10.05 15:20:16字數 543閱讀 7
隔壁同事大佬
專案用的mysql資料庫引擎是innodb,資料庫的行鎖、表鎖是通過innodb使用表的索引來實現的。那麼就先查詢一下innodb的狀態:
show engine innodb status;
只擷取有用資訊:
------------------------
latest detected deadlock
------------------------
2019-08-21 12:08:13 7fb595c29700
*** (1) transaction:
transaction 63912726, active 0 sec updating or deleting
mysql tables in use 1, locked 1
lock wait 3 lock struct(s), heap size 1184, 2 row lock(s), undo log entries 1
mysql thread id 1587325, os thread handle 0x7fb55ee77700, query id 87233990 210.22.120.186 root updating
create_time='2011-08-20 17:54:56.0',
update_time='2011-08-21 12:08:14.468',
user_id=8,
job_status='done',
rerun=0,
merchant_id='asd',
loan_id=502,
`name`='autotest_0815100043938',
phone_number='1234567890',
`source`=0 where id=1163751259396098
*** (1) waiting for this lock to be granted:
record lock, heap no 167 physical record: n_fields 2; compact format; info bits 0
0: len 3; hex 50414e; asc pan;;
1: len 8; hex 901e52e11885c002; asc r ;;
*** (2) transaction:
transaction 63912725, active 0 sec starting index read
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1184, 2 row lock(s)
mysql thread id 1587327, os thread handle 0x7fb595c29700, query id 87233988 210.22.120.186 root creating sort index
*** (2) holds the lock(s):
record lock, heap no 167 physical record: n_fields 2; compact format; info bits 0
0: len 3; hex 50414e; asc pan;;
1: len 8; hex 901e52e11885c002; asc r ;;
*** (2) waiting for this lock to be granted:
record lock, heap no 28 physical record: n_fields 17; compact format; info bits 0
0: len 8; hex 901e52e11885c002; asc r ;;
1: len 6; hex 000003ceb3a3; asc ;;
2: len 7; hex 330000801d021e; asc 3 ;;
3: len 18; hex 363533313237313938363037333034383637; asc 653127198607304867;;
4: len 5; hex 99a3dc9e76; asc v;;
5: len 8; hex 80000000000006f2; asc ;;
6: len 5; hex 99a3dc9e76; asc v;;
7: len 3; hex 50414e; asc pan;;
8: len 1; hex 80; asc ;;
9: sql null;
10: len 20; hex 416d62696c447569742d47504d65726368616e74; asc ambilduit-gpmerchant;;
11: len 8; hex 8000000000001426; asc &;;
12: len 13; hex 4275646920536574696177616e; asc budi setiawan;;
13: len 13; hex 30383133323035313037323233; asc 0813205107223;;
14: sql null;
15: sql null;
16: len 4; hex 80000002; asc ;;
*** we roll back transaction (2)
分析死鎖日誌資訊:
在日誌中可以找到最近一次死鎖的日誌資訊:
------------------------
latest detected deadlock
------------------------
然後在該資訊裡面可以看到有這兩個標題,標題下的資訊就是死鎖產生的原因
holds the lock(s): 當前事務持有的鎖資訊
waiting for this lock to be granted: 當前事務嘗試獲取的鎖資訊
由此可以分析出死鎖產生的原因。
解決這個問題:
根據產生的原因,使用for update來操作行鎖時,最簡單的辦法是直接使用主鍵索引。但是因為功能的需求是獲取明細狀態job_status為pan的第一條,因此sql修改為如下來滿足只根據主鍵索引來進行行鎖:
以上就是我這次遇到死鎖的排查過程和思考過程,如有遺漏或錯誤的地方,歡迎指正出來。謝謝!
記一次mysql死鎖問題
場景 innodb下不同的事務進行更新和插入操作導致資料庫死鎖,如下,在批量插入之前,進行了邏輯刪除操作,這段 在併發情況下出現死鎖 堆疊異常 deadlock found when trying to get lock try restarting transaction 更新操作sql 批量插入...
記一次線上問題排查
這次線上問題來的比較突然,影響也大,用部落格記錄下整個過程,也當作是對這次事故的一次總結歸納。day1 2018年06月21號上午10點,收到運營同事通知,http com api 訪問量劇增,日誌量達到80g 天,而且有上公升趨勢。運營同事讓我們排查,這種訪問是否正常。運營統計訪問量 收到通知後立...
記一次問題排查心得
平時程式執行的好好的,昨天收到一則使用者上報,在xp系統下面,程式啟動後彈出 應用程式正常初始化 0xc0150002 失敗,請單擊確定,終止應用程式 遇到這個問題後,在自己的xp虛擬機器裡面呼叫一把,果然也出現這個問題,接下來記錄解決這個問題的全過程。然後就是各種安裝 解除安裝 檢測組合情況,最後...