我想更新表中的单个记录以反映给定的客户机会话已在多会话环境中获取记录(并且现在拥有该记录以供进一步更新)。我得到这个至今:原子独占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