我有事務性應用程序,像這樣工作的:死鎖和超時打破ACID事務
try {
$db->begin();
increaseNumber();
$db->commit();
} catch(Exception $e) {
$db->rollback();
}
然後是increaseNumber()內我會像這樣的查詢,這是唯一可行的功能與此表:
// I use FOR UPDATE so that nobody else can read this table until its been updated
$result = $db->select("SELECT item1
FROM units
WHERE id = '{$id}'
FOR UPDATE");
$result = $db->update("UPDATE units SET item1 = item1 + 1
WHERE id = '{$id}'");
一切都包裹在一個交易,但最近我一直在處理一些相當緩慢查詢,並有大量的併發在我的應用怎麼回事,所以我真的不能確保查詢將按特定順序運行。
死鎖是否會導致ACID事務中斷?我有一個函數添加了一些東西,然後另一個刪除它,但是當我有死鎖時,我發現數據完全不同步,就像事務被忽略了一樣。
這是否會發生或者是其他的錯誤?
感謝,多米尼克
嘿,我已經添加了一個正在使用的查詢的例子(它只在這個地方使用,並且只是在事務中包裝)。 我認爲死鎖可能會導致事務中斷的原因是,當我發生大量死鎖時,數據在該單元表中不一致。我很困惑,因爲它只用在這一個地方......也許它是FOR UPDATE的一個問題,它允許2個人在死鎖釋放鎖時編輯數據? –
當你懷疑死鎖造成不一致時,你究竟發現了哪些錯誤?據我可以從上面的代碼中知道,你只更新一條記錄,所以在ACID事務結束時,它會被更新或不更新 - 「是否」是回滾的結果。 不一致需要兩次更新才能在同一個事務中發生,其中您看到一個更新發生但沒有發生另一個更新 - 我的代碼中沒有看到類似的更新。 – Soren
我有一個需要執行的任務表。如果兩個人查詢任務表,我使用FOR UPDATE來確保只有一個人執行任務。一個人可以將item1設置爲1,然後另一個人可能希望將其設置爲0.當存在死鎖時,item1的值有時可以是2,3,4,5,6,但它應該只有0或1我感覺到,當發生死鎖時,將事務設置爲0並不成功,它變爲1 + 1 = 2. –