hea*_*ath 2 sql t-sql sql-server locking transactions
如果我想要选择尚未处理的表中的所有记录,然后更新这些记录以反映它们已被处理,我将执行以下操作:
SELECT * FROM [dbo].[MyTable] WHERE [flag] IS NULL;
UPDATE [dbo].[MyTable] SET [flag] = 1 WHERE [flag] IS NULL;
Run Code Online (Sandbox Code Playgroud)
如何确保UPDATE仅对我刚刚选择的记录起作用,即,防止在我的SELECT之后但在我的UPDATE之前由另一个进程发生的[flag] = NULL添加的任何记录的UPDATE?我可以在事务中包装这两个语句吗?我必须把锁放在桌子上吗?
单次调用,使用OUTPUT子句不需要任何事务.
XLOCK独占锁定行以停止并发读取(例如,另一个进程查找NULL行)
UPDATE dbo.MyTable WITH (XLOCK)
SET flag = 1
OUTPUT INSERTED.*
WHERE flag IS NULL;
Run Code Online (Sandbox Code Playgroud)
使用OUTPUT子句从UPDATE本身返回结果集:
UPDATE [dbo].[MyTable]
SET [flag] = 1
OUTPUT INSERTED.*
WHERE [flag] IS NULL;
Run Code Online (Sandbox Code Playgroud)