我有这个存储过程
CREATE PROCEDURE spGrabSerial
@serial nvarchar(16) output
AS
BEGIN
SET NOCOUNT ON;
set @serial = (SELECT top 1 serial from tblSerial)
update tblSerial set InUse = 1 where serial = @serial
END
Run Code Online (Sandbox Code Playgroud)
如何确保没有其他过程在选择和更新之间抓取相同的序列?
假设SQL Server 2005+,您可以使用该OUTPUT
子句在一个原子操作中执行此操作(请参阅将表用作队列).
;with cte as (
select top(1)
serial, InUse
from tblSerial with (rowlock, readpast)
where InUse <> 1
order by serial
)
update cte
set InUse = 1
output inserted.serial
Run Code Online (Sandbox Code Playgroud)
编辑刚刚提醒过这样做的方法可以直接分配给output
参数而不使用该OUTPUT
子句.
with cte as (
select top(1)
serial, InUse
from tblSerial with (rowlock, readpast)
where InUse <> 1
order by serial
)
update cte
set InUse = 1, @serial = serial
Run Code Online (Sandbox Code Playgroud)