mysql併發replace死鎖

最近爲了提升日誌入庫的速度,把入庫的代碼改爲併發的。發現部分日誌入庫的時候mysql報錯:mysql

Error 1213: Deadlock found when trying to get lock; try restarting transaction.

字面意思可見是有死鎖了。sql

出現死鎖,首先查詢狀態日誌,mysql執行:併發

SHOW ENGINE INNODB STATUS

查詢LATEST DETECTED DEADLOCK標籤下的日誌,可見最近一次發生死鎖的語句。再加上對比正常執行的sql語句,問題定位在使用replace into上。rest

innodb是行級鎖,而我是併發且批量去使用replace into去更新表,很容易形成同時兩條語句去更新一行數據。replace的時候會給要更新的行加上排他鎖(X鎖),這就是形成死鎖的緣由。(有惟一索引的表在insert的時候,若是發生了惟一索引衝突,會加上讀鎖(S鎖),理論上在併發處理的時候不會死鎖?待證明)。日誌

相關文章
相關標籤/搜索