我想更新表中的單個記錄以反映給定的客戶機會話已在多會話環境中獲取記錄(並且現在擁有該記錄以供進一步更新)。我得到這個至今:原子獨佔SQL記錄更新
create procedure AcquireRow(
@itemNo int, -- Item ID to acquire
@sessNo int, -- Session ID
@res char(1) out) -- Result
as
begin
-- Attempt to acquire the row
update Items
set
State = 'A', -- 'A'=Acquired
SessionID = @sessNo
where ItemID = @itemNo
and State = 'N'; -- 'N'=Not acquired
-- Verify that the session actually acquired the row
set @res = 'T'; -- 'T'=Success
if @@rowcount = 0
set @res = 'F'; -- 'F'=Failure
end;
out變量@state
設置爲'T'
如果過程成功收購該行,否則它設置爲'F'
表示失敗。
我的問題:這是保證自動工作,以便只有一個會話成功獲取(更新)該行,如果多個會話同時呼叫AcquireRow()
?或者有更好的方法來做到這一點?我需要一個明確的rowlock
?
修訂:
基於Remus的答案,我將因此重新排列代碼:
set @res = 'F';
update ...;
if @@rowcount > 0
set @res = 'T';
使用一個output
條款或分配結果行的ItemID
到update
內的變量也將是審慎的。
一個非常相似的問題已經被問過這樣,但我不能找到它.... – 2009-09-26 00:30:49
這一個類同,但不是我的初衷:http://stackoverflow.com/questions/574549/高效,交易記錄鎖定 – 2009-09-26 00:39:03