mysql行鎖等待分析

2022-03-06 19:19:04 字數 1934 閱讀 5464

程式通過update xx set where id in (a,b,c)一次性鎖大量id,其中某些id被其他session鎖住了。當超過innodb_lock_wait_timeouttry restarting transaction

早上來到公司檢查公司郵件,發現報錯郵件了。

怎麼可以忽視, 當然要檢查一番。?

程式中update的時候用到mid in ()這種語句想要一次性鎖住多行,其中某些id被同事執行的update鎖住了。

如果update xx set a=b where id =x;這種語句一次性鎖一行, 那麼很快就會釋放, 不存在

開啟事務,鎖住一條記錄。

嘗試鎖住多條

直接加寫鎖

用update讓其自動加寫鎖

超時後報try restarting transaction, 與線上的情況一致了。

那麼try restarting transaction是由什麼引起的呢?

檢視資料後得知 innodb 行鎖等待預設超時時間為50秒,可以通過set innodb_lock_wait_timeout xx變更。

執行set innodb_lock_wait_timeout 5後,果然是5秒才報錯。try restarting transaction

檢視行鎖衝突的執行緒

檢視被阻塞的執行緒

mysql innodb 鎖等待和鎖等待超時的處理

mysql 鎖等待表 MySQL表的鎖等待

今天線上業務遇到乙個問題,因為一張模擬自增序列的表被鎖住,涉及該錶的業務受到影響。線上情況 1 這個表只有乙個id欄位。今天線上業務遇到乙個問題,因為一張模擬自增序列的表被鎖住,涉及該錶的業務受到影響。線上情況 1 這個表只有乙個id欄位。2 id欄位為主鍵索引 3 該錶只有一行資料,記錄全域性最大...

mysql 行鎖 訂票 mysql 行鎖

在電子商務裡,經常會出現庫存數量少,購買的人又特別多,大併發情況下如何確保商品數量不會被多次購買.其實很簡單,利用事務 for update就可以解決.我們都知道for update實際上是共享鎖,是可以被讀取的.但是如何在執行時,不被讀取呢.簡單來說 假設現在庫存為1,現在有a和b同時購買 先開啟...

MySQL找出鎖等待

1.伺服器級別的鎖等待 可以通過show processlist看到等待鎖的執行緒id,但是無法知道究竟哪個執行緒持有鎖 可以通過mysqladmin debug 相關等待鎖的執行緒以及誰持有鎖可以在錯誤日誌中找到 2.儲存引擎層的鎖等待則比較麻煩,以下是innodb儲存引擎中鎖等待以及哪個執行緒持...