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=
66042
and 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...