考慮這種情況:交易是否會停止MySQL中的所有競爭條件問題?
- BEGIN TRANSACTION
- 插入20個記錄到一個表的AUTO_INCREMENT鍵
- 獲得第一個插入ID(讓我們說這是
153
) - 更新的所有記錄在該表其中
id >= 153
- 提交
第4步安全嗎?
也就是說,如果另一個請求幾乎同時進入,並且在步驟2之後插入另外20個記錄,但在步驟4之前,會出現競爭狀態嗎?
考慮這種情況:交易是否會停止MySQL中的所有競爭條件問題?
153
)id >= 153
第4步安全嗎?
也就是說,如果另一個請求幾乎同時進入,並且在步驟2之後插入另外20個記錄,但在步驟4之前,會出現競爭狀態嗎?
我不認爲這是可以編目爲競爭狀態,而是一種DMBS特定的行爲。基本上,如果DBMS鎖定新插入的記錄,那麼在提交第二個事務之前,第一個事務將不會看到第二個事務中的記錄。
當然還有鎖定表的問題,如果第一個事務寫入鎖定表,那麼第二個寫入將被阻塞,直到第一個事務完成。不知道如果標準的MySQL提供這種功能。我知道它的MSSQL服務器。
爲什麼你會有一個單獨的更新步驟,而不是在第一個地方插入正確的數據?這很奇怪。如果您首先插入了正確的數據,則無需擔心「競爭條件」。更新'WHERE id> 153'也是一個非常奇怪的查詢。自動增量ID對他們沒有任何邏輯,所以你不應該(只要我知道)僅基於ID進行更新。最後,我不知道有任何「第一次插入ID」功能。 – 2013-01-14 07:35:30
@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
你對LAST_INSERT_ID()是正確的,但它並沒有改變這個問題似乎是關於一個假設的情況,如果遵循基本的數據庫結構和過程將永遠不會存在的事實。爲什麼你的更新標準永遠是無意義ID的價值?我想不出任何理由。我不會稱之爲「競爭條件」,因爲它是無意義的。爲什麼插入後立即更新,何時才能插入正確的值?這些是這個問題沒有意義的真正原因。 – 2013-01-16 01:03:27