這是否會導致與MySQL(InnoDB的)的競爭條件:MySQL的競爭條件
開始交易。
嘗試獲取記錄。
如果記錄不存在,則返回。
如果記錄存在,請將其刪除並添加一條日誌條目,說明該條目已被刪除。
結束事務(提交/回滾)。
是否有可能爲另一個進程剛剛2B刪除步驟之前開始,檢測記錄的存在,然後有兩個過程輸入貨品刪除條目記錄到日誌?
我需要採取哪些預防措施?
謝謝。
這是否會導致與MySQL(InnoDB的)的競爭條件:MySQL的競爭條件
開始交易。
嘗試獲取記錄。
如果記錄不存在,則返回。
如果記錄存在,請將其刪除並添加一條日誌條目,說明該條目已被刪除。
結束事務(提交/回滾)。
是否有可能爲另一個進程剛剛2B刪除步驟之前開始,檢測記錄的存在,然後有兩個過程輸入貨品刪除條目記錄到日誌?
我需要採取哪些預防措施?
謝謝。
是的,在閱讀完其它事務後,可能會檢查表。
更糟的是,由於事務的工作方式,即使在刪除該行之後,任何啓動的新事務都會看到該行,因爲您尚未提交刪除操作。
SELECT ... FOR UPDATE
是防止它的一種方法。
LOCK TABLE tablename
是另一個。
不幸的是,由於您使用的是ORM,我不能說它是否有能力做到這兩者之一。
我認爲,熟練程序員有正確的解決方案。既然你已經表明你正在使用一個破損的ORM工具(一個不允許你查詢更新的工具),我建議你將你的INSERT移入日誌表到刪除操作的觸發器中,這樣你就可以避免重複條目。
開始交易。
刪除記錄/使用您使用非常相同的標準*「試圖獲得創紀錄的」 */
如果響應表示記錄確實已被刪除,添加一個日誌條目。
結束事務(提交/回滾)。
沒有更多的競爭條件。
您是否看到這種行爲?或者這純粹是一個理論問題? – Joe 2009-04-27 21:12:16
如果您在日誌表上有唯一的索引,那麼第二個線程將無法在其中添加重複的條目,並且第二個線程將被回滾。再次指出救援。 – 2013-01-14 06:45:19