2010-05-11 47 views
5

考慮這種情況:交易是否會停止MySQL中的所有競爭條件問題?

  1. BEGIN TRANSACTION
  2. 插入20個記錄到一個表的AUTO_INCREMENT鍵
  3. 獲得第一個插入ID(讓我們說這是153
  4. 更新的所有記錄在該表其中id >= 153
  5. 提交

第4步安全嗎?

也就是說,如果另一個請求幾乎同時進入,並且在步驟2之後插入另外20個記錄,但在步驟4之前,會出現競爭狀態嗎?

+0

爲什麼你會有一個單獨的更新步驟,而不是在第一個地方插入正確的數據?這很奇怪。如果您首先插入了正確的數據,則無需擔心「競爭條件」。更新'WHERE id> 153'也是一個非常奇怪的查詢。自動增量ID對他們沒有任何邏輯,所以你不應該(只要我知道)僅基於ID進行更新。最後,我不知道有任何「第一次插入ID」功能。 – 2013-01-14 07:35:30

+0

@ButtleButkus http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id「如果使用單個INSERT語句插入多行,則LAST_INSERT_ID()將返回值爲第一個插入的行生成「 – nickf 2013-01-14 15:19:17

+0

你對LAST_INSERT_ID()是正確的,但它並沒有改變這個問題似乎是關於一個假設的情況,如果遵循基本的數據庫結構和過程將永遠不會存在的事實。爲什麼你的更新標準永遠是無意義ID的價值?我想不出任何理由。我不會稱之爲「競爭條件」,因爲它是無意義的。爲什麼插入後立即更新,何時才能插入正確的值?這些是這個問題沒有意義的真正原因。 – 2013-01-16 01:03:27

回答

5

也就是說,如果另一個請求幾乎同時進入,並且在步驟2之後插入另外20條記錄,但在步驟4之前會出現競爭狀態嗎?

是的,它會的。

記錄2140將被交易2鎖定。

交易1將被封鎖並等待交易2提交或回滾。

如果交易2提交,然後交易1將更新40記錄(包括那些由交易2插入)

+1

你能澄清嗎?你是說有問題嗎? – nickf 2010-05-11 07:41:29

+0

@nickf:查看帖子更新。 – Quassnoi 2010-05-11 07:47:29

0

我不認爲這是可以編目爲競爭狀態,而是一種DMBS特定的行爲。基本上,如果DBMS鎖定新插入的記錄,那麼在提交第二個事務之前,第一個事務將不會看到第二個事務中的記錄。

當然還有鎖定表的問題,如果第一個事務寫入鎖定表,那麼第二個寫入將被阻塞,直到第一個事務完成。不知道如果標準的MySQL提供這種功能。我知道它的MSSQL服務器。