T-SQL事务和表锁定

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?我可以在事务中包装这两个语句吗?我必须把锁放在桌子上吗?

gbn*_*gbn 6

单次调用,使用OUTPUT子句不需要任何事务.

XLOCK独占锁定行以停止并发读取(例如,另一个进程查找NULL行)

UPDATE dbo.MyTable WITH (XLOCK)
SET flag = 1 
OUTPUT INSERTED.*
WHERE flag IS NULL;
Run Code Online (Sandbox Code Playgroud)


Rem*_*anu 5

使用OUTPUT子句从UPDATE本身返回结果集:

UPDATE [dbo].[MyTable] 
SET [flag] = 1 
OUTPUT INSERTED.*
WHERE [flag] IS NULL;
Run Code Online (Sandbox Code Playgroud)