標籤:timeout its format 項目 也會 開始時間 innodb 行記錄 權重
在練習項目中,沒有使用mysql行級鎖。而是通過rabbitmq隊列,使用庫存增加以及減少。通過顯示建立事務實現兩表更新資料。在測試過程中,多人操作訂單,導致出現事務鎖逾時,在MySQL命令列使用
show full processlist;
查到MySQL有很多update進程處於sleep中。可以判斷可能由於事務中的邏輯中斷或者代碼出錯後未關閉MySQL串連控制代碼導致,也就是事務鎖一直處於未關閉狀態。
相關資料:
show full processlist;
在沒有InnoDB Plugin之前使用,其很難發現被鎖行記錄問題所在,shou engine innodb status只能查看當前資料庫請求,以及當前事務中鎖的情況。
目前可以通過MySQL資料庫內建information_schema庫中的三張表來解決問題:INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS。
比較常用的列:
trx_id:InnoDB儲存引擎內部唯一的事物ID
trx_status:當前事務的狀態
trx_status:事務的開始時間
trx_requested_lock_id:等待事務的鎖ID
trx_wait_started:事務等待的開始時間
trx_weight:事務的權重,反應一個事務修改和鎖定的行數,當發現死結需要復原時,權重越小的值被復原
trx_mysql_thread_id:MySQL中的進程ID,與show processlist中的ID值相對應
trx_query:事務啟動並執行SQL語句
kill 進程ID; 工作中遇到了一條查詢記錄,select * from car for update 或者是修改某個欄位的值,就報錯:Lock wait timeout exceeded; try restarting transaction解決方案,另外從根本上從商務邏輯代碼最佳化對資料庫的操作,之前也遇到過此類情況,比如剛剛修改完這條記錄,接著再次修改,也會報此錯誤,從代碼和業務層面盡量避免開來。
mysql使用 隨筆一