mysql更新死鎖問題

最近在使用ThreadPoolTaskExecutor實現多線程過程中,在對數據表的更新操作時,遇到了行級鎖問題,即多個更新的語句同時執行時,出現了因併發導致一條更新佔用了該行的鎖,導致另一條更新無法獲取鎖,更新失敗。
表結構如下
CREATE TABLE `batch_job_seq` (
  `ID` bigint(20) NOT NULL,
  `UNIQUE_KEY` char(1) NOT NULL,
  UNIQUE KEY `UNIQUE_KEY_UN` (`UNIQUE_KEY`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
查看相關資料發現了一個比較專業的總結,在此做個記錄吧,如下:
在採用INNODB的MySQL中,更新操作默認會加行級鎖,行級鎖是基於索引的,在分析死鎖之前需要查詢一下mysql的執行計劃,看看是否用到了索引,用到了哪個索引,對於沒有用索引的操作會採用表級鎖。如果操作用到了主鍵索引會先在主鍵索引上加鎖,然後在其他索引上加鎖,否則加鎖順序相反。在併發度高的應用中,批量更新一定要帶上記錄的主鍵,優先獲取主鍵上的鎖,這樣可以減少死鎖的發生。

轉述:http://ju.outofmemory.cn/entry/199937

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章