我想要實現像原子事務如下:我應該使用哪種鎖定提示(T-SQL)?
BEGIN TRAN A
SELECT id
FROM Inventory
WITH (???)
WHERE material_id = 25 AND quantity > 10
/*
Process some things using the inventory record and
eventually write some updates that are dependent on the fact that
that specific inventory record had sufficient quantity (greater than 10).
*/
COMMIT TRAN A
的問題是,還有其他的交易發生,從我們的庫存消耗數量,所以時間之間的記錄被選中,更新寫入在事務A中,該記錄可能會變成無效選擇,因爲它的數量可能已降低到WHERE子句中的閾值以下。
所以問題是我應該在WITH子句中使用什麼鎖定提示來防止在完成更新和提交事務之前更改選定的庫存記錄?
編輯: 非常感謝約翰,好的解決方案似乎是將事務隔離級別設置爲REPEATABLE READ。這將確保「在當前事務完成之前,沒有其他事務可以修改已被當前事務讀取的數據」。
好問題...我將要工作的一些代碼,完全適合這個標準很快......我甚至沒有意識到這是一個問題:) – 2009-01-30 20:29:34
謝謝安德魯!事實上,如果數據或者交易使用的假設在處理過程中發生了變化,那麼交易並不會真正產生一致的結果。 – Daniel 2009-01-30 20:55:19