分享乙個MySQL死鎖問題解決的方法

2021-08-28 12:18:30 字數 2078 閱讀 1963

2017-2-25 17:38:41 org.hibernate.util.jdbcexceptionreporter logexceptions

嚴重: lock wait timeout exceeded; try restarting transaction

2017-2-25 17:39:05 org.hibernate.util.jdbcexceptionreporter logexceptions

警告: sql error: 1213, sqlstate: 40001

2017-2-25 17:39:05 org.hibernate.util.jdbcexceptionreporter logexceptions

嚴重: deadlock found when trying to get lock; try restarting transaction

check innodb status for locks

mysql> show engine innodb status;

check mysql open tables

mysql> show open tables where in_use > 0;

check pending innodb transactions

mysql> select * from `information_schema`.`innodb_trx` order by `trx_started`;

check lock dependency - what blocks what

mysql> select * from `information_schema`.`innodb_locks`;

排查後發現都是執行類似這樣的語句出現問題的:

update t_task_tel set state='iok', update_date='2017-02-27 11:03:02'where tel_id=66042and task_id=350199;

搜尋相關資料後發現,原來mysql innodb並不一定都是行級鎖。

鎖選擇1)、如果更新條件沒有走索引,例如執行」update from t1 set v2=0 where v2=5;」 ,此時會進行全表掃瞄,掃表的時候,要阻止其他任何的更新操作,所以上公升為表鎖。

2)、如果更新條件為索引字段,但是並非唯一索引(包括主鍵索引),例如執行「update from t1 set v2=0 where v1=9;」

那麼此時更新會使用next-key lock。使用next-key lock的原因:

a)、首先要保證在符合條件的記錄上加上排他鎖,會鎖定當前非唯一索引和對應的主鍵索引的值;

b)、還要保證鎖定的區間不能插入新的資料。

3)、如果更新條件為唯一索引,則使用record lock(記錄鎖)。

innodb根據唯一索引,找到相應記錄,將主鍵索引值和唯一索引值加上記錄鎖。但不使用gap lock(間隙鎖)。

由於innodb預設是row-level lock,所以只有「明確」的指定主鍵,mysql才會執行row lock (只鎖住被選取的資料例) ,否則mysql將會執行table lock (將整個資料表單給鎖住)。

根據分析結論,猜測是在更新_task_tel表時where條件中tel_id和task_id沒有建立unique(唯一索引)原因;

據此分析,嘗試通過tel_id和task_id兩個字段建立unique(唯一索引)來解決。 (也可以先查詢出來,然後根據主鍵id來更新,這樣不會因表中資料量較大影響線上業務)。

通過此種方式解決後,問題沒有再重現。

如果你的問題和我遇到的類似,可以嘗試據此解決。

mysql 死鎖問題解決

前些天除錯 的時候突然丟擲如下異常 總結一下就是 新增事務的時候失敗,原因是事務鎖被另乙個執行緒持有,並且這個執行緒一致沒被釋放這個事務鎖。除錯的時候,強制退出程式,沒有關閉事務 然後就去搜了一下資料庫的事務鎖死鎖問題解決,搜到如下內容 總結一下處理步驟 1.找到所有執行緒 show full pr...

mysq 死鎖問題解決

1 查詢是否存在死鎖 show open tables where in use 0 2 查詢死鎖itrx mysql thread id select from information schema.innodb trx 命令是用來檢視當前執行的所以事務 select from informati...

SQLSERVER2005 死鎖問題解決

問題描述 有乙個省公司的sqlserver2005資料庫,因為資料庫過大800g,重新建庫後,有1g多,然後重建同步,14個地市的資料同步,會引起省公司資料庫個別表的死鎖 問題查詢 1 sp lock 2 select object name 3 insert into sfemsdb1.sfems...