MySQL 死鎖和鎖等待

哎呀我的天吶發表於2020-04-13

【資料庫版本】MySQL5.7

【問題現象】 今天遇到了一個鎖超時的問題,但是客戶說是deadlock,讓幫分析下死鎖監控模組為什麼沒有顯示到這個死鎖錯誤

【問題小結】程式報錯 1205 Lock wat timeout exceeded,客戶以為是deadlock,其實是兩個概念,說明死鎖監控模組是沒問題的。死鎖監控到的是死鎖,而不是鎖等待。


報錯資訊如下:

SQLSTATEHY000]:General error: 1205 Lock wat timeout exceeded; try restarting transaction (SQL: UPDATE xx set xxx = 100 where id=1 and rock_id > 1) 


1213 Deadlock found when trying to get lock; try restarting transaction


https://www.cnblogs.com/tartis/p/9366574.html

https://dev.mysql.com/doc/refman/8.0/en/innodb-deadlock-example.html

MySQL 5.7我們可以透過下面語句查詢鎖狀態資訊

SELECT 
  r.trx_id waiting_trx_id,
  r.trx_mysql_thread_id waiting_thread,
  r.trx_query waiting_query,
  b.trx_id blocking_trx_id,
  b.trx_mysql_thread_id blocking_thread,
  b.trx_query blocking_query 
FROM
  information_schema.`INNODB_LOCK_WAITS` w 
  INNER JOIN information_schema.`INNODB_TRX` b 
    ON b.`trx_id` = w.`blocking_trx_id` 
  INNER JOIN information_schema.`INNODB_TRX` r 
    ON r.`trx_id` = w.`requesting_trx_id`;

MySQL8.0 我們透過如下語句檢視鎖資訊

select * from x$innodb_lock_waits;




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29990276/viewspace-2685797/,如需轉載,請註明出處,否則將追究法律責任。

相關文章