2014-01-14 22 views
2

我讀過MySQL 14.2.7.6的文檔。鎖由不同的SQL語句用在InnoDBMySQL重複密鑰錯誤導致在重複索引記錄上設置共享鎖?

http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html

我的問題設置:

  1. 我不明白爲什麼文檔狀態:

    如果發生重複鍵錯誤,設置重複索引 記錄的共享鎖。如果另一個 會話已具有排他鎖,則如果使用共享鎖,則會導致死鎖,因爲 會有多個會話嘗試插入同一行。如果另一個會話刪除該行,則會發生這種情況。

    爲什麼它在該行上設置鎖定,因爲INSERT操作的 失敗。它獲得了什麼鎖?

  2. 當執行「SELECT ... LOCK IN SHARE MODE」時是否設置了意圖共享(IS)鎖定?當「UPDATE,INSERT,DELETE」或「SELECT ... FOR UPDATE」爲 執行時,意向排他(IX)鎖定集 ?

回答

2

.1。它需要對現有條目進行鎖定,以便後續插入重複記錄的嘗試始終如一地失敗:

-- Transaction A 
BEGIN TRANSACTION; 
INSERT INTO mytable VALUE(1); -- fails as "duplicate" 

-- Transaction B 
BEGIN; 
DELETE FROM mytable WHERE field = 1; -- must be put on hold, see below 

-- Transaction A 
-- transaction is still in progress 
INSERT INTO mytable VALUE(1); -- must fail to stay consistent with the previous attempt 

.2。 Yes, and yes

意圖鎖協議如下:

  • 前一個交易能在一行獲取小號鎖定在表,它必須首先獲取IS或更強鎖t
  • 事務可以獲取關於行的X鎖之前,必須首先在獲取IX鎖。
+0

嗨。第一個問題。你的意思是它獲得了鎖以保持其在同一交易中的操作不會被阻止? – Alexis

+0

不,我的意思是如果允許同時刪除這兩個事務將會不一致。設想「交易B」成功(即,如果「交易A」沒有設置鎖定)。第二次INSERT嘗試的結果是什麼?選項1:成功。但是這與第一次嘗試失敗不一致。選項2:失敗。但併發事務已刪除該行,所以不應該有衝突。 – RandomSeed

+0

謝謝。 RS。現在明白了 – Alexis