我有一個表tbl_orders
。它有一個數量字段quantity
。 在我的應用程序的某些部分,我需要通過1防止2個用戶同時更新相同的記錄
遞減量我已經知道了記錄的id
(可從客戶端),所以我發出一個更新語句:
UPDATE tbl_orders
SET quantity=quantity-1
WHERE id= 6
問題是這個查詢可能會意外地同時運行多次。 例如,2個客戶服務運營商可能會同時更新相同的記錄。 這意味着當它應該減少一次時,數量將減少2。
我試圖在事務中放置更新,但導致只會延遲第二個事務,直到提交第一個事務爲止。一旦提交,第二次更新就會運行並再次減少記錄。
如何確保在修改記錄時其他查詢失敗?
UPDATE:
的更新是有效的在客戶端的數量是在數據庫中的相同。例如,如果用戶在瀏覽器上看到數量5並想減少數量,則數據庫中的值必須相同。
更新2
我發現使用Doctrine 2樂觀鎖定一個很好的解釋here:
這可能不是在數據庫端解決的問題,因爲那時有時你會想* *量將由2。你需要告訴的萬無一失的方法,當多個查詢是一個意外,而當他們遞減'是故意的。 – histocrat
你如何知道什麼時候允許更新通過以及何時不通過?例如,如果兩個用戶分別點擊按鈕毫秒,會發生什麼? –
@ D-Rock如果客戶端的數量在數據庫中相同,則該值有效。例如,如果用戶在瀏覽器上看到數量5並想減少數量,則數據庫中的值必須相同。 – Songo