(注意:這是針對MS SQL Server的)SQL Server競爭條件問題
假設您有一個帶有主鍵標識列和CODE列的表ABC。我們希望這裏的每一行都有一個唯一的,順序生成的代碼(基於一些典型的校驗位公式)。
假設你有另一個只有一行的DEF表,它存儲了下一個可用的CODE(設想一個簡單的自動編號)。
我知道像下面邏輯將呈現競爭狀態,其中兩個用戶可以使用相同的代碼結束:
1) Run a select query to grab next available code from DEF
2) Insert said code into table ABC
3) Increment the value in DEF so it's not re-used.
我知道,兩個用戶可能會卡在步驟1),並能最後在ABC表中使用相同的代碼。
處理這種情況的最佳方法是什麼?我認爲我可以圍繞這個邏輯包裝一個「begin tran」/「commit tran」,但我認爲這並不奏效。我有一個存儲過程,這樣的測試,但我沒有避免競爭狀態,當我從MS兩個不同的窗口跑:
begin tran
declare @x int
select @x= nextcode FROM def
waitfor delay '00:00:15'
update def set nextcode = nextcode + 1
select @x
commit tran
有人可以提供一些線索這光?我認爲這個事務會阻止另一個用戶在第一個事務完成之前訪問我的NextCodeTable,但我認爲我對事務的理解是有缺陷的。
編輯:我試着移動等待到「更新」語句後,我得到了兩個不同的代碼......但我懷疑這一點。我在那裏等待語句來模擬延遲,因此可以很容易地看到比賽情況。我認爲關鍵問題是我對交易如何運作的錯誤認識。
您應該查看我已故的答案:接受一個不正確... – gbn 2011-04-03 09:30:52