程式通過update xx set where id in (a,b,c)
一次性鎖大量id,其中某些id被其他session鎖住了。當超過innodb_lock_wait_timeout
會try 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儲存引擎中鎖等待以及哪個執行緒持...