假設我們有一個t1
表,其中整數weight
列被標記爲唯一,item_id
是主鍵。以下查詢可以失敗嗎?這個查詢競賽條件是免費的嗎?
UPDATE t1
SET weight = SELECT new_weight FROM (
SELECT MAX(weight) + 1 AS new_weight FROM t1
) qs
WHERE item_id = ?
其中?
是一個參數。有可能是因爲一場比賽兩項物品會試圖設定相同的重量?或者那個數據庫引擎是特定的?
這取決於數據庫引擎以及正在使用的隔離級別(如果適用)。 –
如果您的數據庫管理系統支持序列,自動編號或標識列,則應該使用它們。否則,您爲多個用戶唯一安全的選擇就是序列化對錶的訪問權限,即爲您的交易鎖定表。 –