日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

insert ... on duplicate key update产生death lock死锁原理

發布時間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 insert ... on duplicate key update产生death lock死锁原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自??insert ... on duplicate key update產生death lock死鎖原理

前言

編輯

????我們在實際業務場景中,經常會有一個這樣的需求,插入某條記錄,如果已經存在了則更新它如果更新日期或者某些列上的累加操作等,我們肯定會想到使用INSERT ... ON DUPLICATE KEY UPDATE語句,一條語句就搞定了查詢是否存在和插入或者更新這幾個步驟,但是使用這條語句在msyql的innodb5.0以上版本有很多的陷阱,即有可能導致death lock死鎖也有可能導致主從模式下的replication產生數據不一致。

正文

????正如前言說的那樣,在實際業務中,曾經有過一個需求就是插入一條業務數據,如果不存在則新增,存在則累加更新某一個字段的值,于是乎就想到了使用insert... on duplicate key update這個語句,但是有一天去測試環境查看錯誤日志時,卻發現了在多個事務并發執行同一條insert...on duplicate key update 語句時,也就是insert的內容相同時,發生 了死鎖。

??對于insert...on duplicate key update這個語句會引發dealth lock問題,官方文檔也沒有相關描述,只是進行如下描述:

An?INSERT ... ON DUPLICATE KEY UPDATE?statement against a table having more than one unique or primary key is also marked as unsafe. (Bug #11765650, Bug #58637)

也就是如果一個表定義有多個唯一鍵或者主鍵時,是不安全的,這又引發了以一個問題,見https://bugs.mysql.com/bug.php?id=58637

也就是

當mysql執行INSERT ON DUPLICATE KEY的 INSERT時,存儲引擎會檢查插入的行是否會產生重復鍵錯誤。如果是的話,它會將現有的 行返回給mysql,mysql會更新它并將其發送回存儲引擎。當表具有多個唯一或主鍵時,此語句對存儲引擎檢查密鑰的順序非常敏感。根據這個順序, 存儲引擎可以確定不同的行數據給到mysql,因此mysql可以更新不同的行。存儲引擎檢查key的順序不是確定性的。例如,InnoDB按照索引添加到 表的順序檢查鍵。

?????insert ... on duplicate key 在執行時,innodb引擎會先判斷插入的行是否產生重復key錯誤,如果存在,在對該現有的行加上S(共享鎖)鎖,如果返回該行數據給mysql,然后mysql執行完duplicate后的update操作,然后對該記錄加上X(排他鎖),最后進行update寫入。

????如果有兩個事務并發的執行同樣的語句,那么就會產生death lock,如:

?

具體的bug描述見:https://bugs.mysql.com/bug.php?id=52020

https://bugs.mysql.com/bug.php?id=58637

編輯

https://bugs.mysql.com/bug.php?id=21356

?

解決辦法:

1、盡量不對存在多個唯一鍵的table使用該語句

2、在有可能有并發事務執行的insert 的內容一樣情況下不使用該語句

總結

以上是生活随笔為你收集整理的insert ... on duplicate key update产生death lock死锁原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。