我有一系列T查询,需要原子地运行。(见下文)..。其目的是允许一个用户一次检索一个唯一的行,并防止其他用户同时检索同一行。
到目前为止,我已经看到了两种可能的解决办法。1)表提示(HOLDLOCK,TABLOCKX)和2)事务隔离级别(SERIALIZABLE)
我的问题:
DECLARE @recordId int;
SELECT @recordId = MIN([id])
FROM Exceptions
WHERE [status] = 'READY';
UPDATE Exceptions
SET [status] = 'PROCESSING',
[username] = @Username
WHERE [id] = @recordId;
SELECT *
FROM Exceptions
WHERE [id] = @recordId;发布于 2011-02-07 18:29:54
在这种情况下,
这两个概念是不同的,也不是你想要的。
要执行您想做的事情,要执行避免比赛条件,需要强制非阻塞(READPAST)独占(UPDLOCK)行级(行锁)锁。还可以使用OUTPUT子句使其成为一个将是原子语句的语句。这个音阶很好。
UPDATE
E
SET
[status] = 'PROCESSING', [username] = @Username
OUTPUT
INSERTED.*
FROM
(
SELECT TOP 1 id, [status], [username]
FROM Exceptions (ROWLOCK, READPAST, UPDLOCK)
WHERE [status] = 'READY'
ORDER BY id
) E一般来说,锁有三个方面。
PAGLOCK, ROWLOCK, TABLOCK)HOLDLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE)UPDLOCK, XLOCK)和
NOLOCK, TABLOCKX )发布于 2011-02-07 18:55:39
您描述的是典型的队列处理,不需要tablockx,也不需要可序列化,也不需要它们实际工作。我建议您通过将表用作队列进行深入的讨论,讨论什么是可能的,什么是不可能的。它的主旨是:
https://stackoverflow.com/questions/4924861
复制相似问题