mysql insert into select 語句為什麼會造成死鎖?

時間 2021-06-01 01:49:43

1樓:

我也想問,為什麼session2,session3不確定是否是應該報錯為什麼就去申請共享鎖呢?是不是發現有事務正則插入,可能大概率是會報錯,所以獲取個共享鎖讀一下,如果真是存在,就報錯,不存在就獲取X鎖繼續插入。但是為何不直接請求X鎖,X鎖也可以讀吧,如果讀到是有記錄報錯。

沒記錄,就插入。這樣不就沒問題了?

所以獲取共享鎖是為了提高效率?畢竟共享鎖的開銷小。也就是說當session1大概率是commit的時候,所有獲取共享鎖的insert都會報錯。

如果是後面這種方式直接等待X鎖,那麼,所有Insert都得乙個個獲取X鎖(排他鎖,必須乙個個獲取,不能像共享鎖一樣所有都獲取),這樣,正常情況下,session1提交,效率大大提高。是這樣嗎?

2樓:foxytale

這裡說乙個概念,快照讀與當前讀

快照讀就是一般執行的select,這個是沒有鎖結構的,不會產生鎖,所以也不會產生死鎖的情況

重點是當前讀,顧名思義就是讀取當前塊的狀態。典型的例子就是select for update,與dml語句。dml中的select子句也是當前讀。當前讀是有鎖結構的,行級排他。

從這個角度去理解的話,就比較輕鬆理解鎖的問題

3樓:楊志豐

上下文不清楚,只看語句可能僅僅是因為你插入的行衝突太大。後面的子查詢讀的時候行不存在,要插入的時候鎖衝突了。另外,這就是乙個unique key的需求啊。

4樓:榴蓮披薩

不太清楚死鎖原因,不過建議使用 replace into 代替你的sql,這種insert select 明顯效率非常低,如果不行要從設計層面想辦法繞開這種低效率的插入方式。

5樓:

之前我在實際開發中遇到過mysql死鎖問題,然後順便研究了下mysql的鎖機制以及產生死鎖的場景。分析下這個問題,如有不正確的地方,請指出!

確實,當資料表中不存在一條記錄時,併發insert兩條統一條記錄(包含的唯一鍵也相同)是可能會出現死鎖的。

假設有3個session都去插入同一條記錄(假設t1是唯一鍵):

Session1:

START

TRANSACTION

;INSERT

INTO

t1VALUES(1

);Session2:

START

TRANSACTION

;INSERT

INTO

t1VALUES(1

);Session3:

START

TRANSACTION

;INSERT

INTO

t1VALUES(1

);我們知道,insert是會對對應的行加排它鎖的。假設session 1獲取到了排它鎖,那麼session 2和session 3均會報主鍵重複的錯誤。而發生主鍵重複的錯誤時,這行是會被加共享鎖的(參考mysql user manual:

If a duplicate-key error occurs, a shared lock on the duplicate index record is set. This use of a shared lock can result in deadlock should there be multiple sessions trying to insert the same row if another session already has an exclusive lock)。這個時候Session 2和session 3均會嘗試獲得這一行的共享鎖。

這個時候如果Session 1 回滾,那麼它會釋放之前加的排它鎖。這個時候Session 2和Session 3會完成獲得共享鎖。

這個時候Session 2和Session 3就發生死鎖了,因為各自持有共享鎖,而均欲獲得排它鎖。都不能達到各自的目的,死鎖了。

我實際測試過,確實是這樣。不過如果Session 1 commit的話不會造成死鎖,這個地方有點不明白,不知道哪位大俠能否給解釋下?

其實MySQL的鎖機制以及發生死鎖的場景是很複雜的一塊,很多時候看上去很簡單的SQL都會發生死鎖,初次遇到估計會很詫異。

關於鎖機制我之前有寫過乙個ppt,總結了鎖機制以及常見的幾種死鎖場景:

技術分享-MySQL InnoDB locks and deadlocks

然後給出一些不錯的參考資料:

(1)首先必然是官方文件:

MySQL :: MySQL 5.5 Reference Manual ::

14.8.3 Locks Set by Different SQL Statements in InnoDB

(2)阿里DBA大牛-何登成的部落格

何登成的技術部落格

(3)《高效能MYSQL》

人為什麼會 死?

鯤夢蝶 人為什麼會死?這個問題看似簡單幼稚,但真的要細細思考的話,誰有能真的做出完美的答覆呢?神論者和科學論者已為了這個問題爭論了上千年直到如今,也沒有乙個結果。但我知道,如果人不會死,將是一件非常恐怖的事情 生命不能得到尊重,在人生漫長的旅行面前友情 愛情 親情將會變得脆弱不堪,人類將會失去慾望。...

為什麼人會死!!!!!!!!!

阿布是糖不是刀 從生物學角度,這樣人這個種族才會進步,只有把上一代淘汰在能更新換代 但是我是乙個非常感性的人,我不接受身邊人的離去,我每乙個人都想挽留,但是疾病卻會將乙個個人帶走,癌症 抑鬱症 心臟病 害沒辦法,無法留住身邊的每乙個人 那麼就在身邊人都在的時候,珍惜彼此,珍惜每一次相處,創造美好的回...

為什麼釋迦牟尼會死

何亦飛 就乙個,野豬肉變質了。是個人吃,都很有可能會死。想體驗下釋迦摩尼的死法麼,弄塊臭豬肉,吃下去,你就能見到佛祖了。世本無佛,後人附之。 按照佛教說法,相當於他發現了地球online的後門,賬號登出了,原賬號人物是有死亡的,但操作的玩家還在,還可以時不時建立新賬號來地球online玩。這時候有個...