Sql TABLOCKX与可序列化
我有一系列需要原子化运行的T-SQL查询。(见下文)。。。其目的是允许一个用户一次检索一个唯一的行,并防止其他用户同时检索同一行 到目前为止,我看到了两种可能的解决办法。1) 表提示(HOLDLOCK、TABLOCKX)和2)事务隔离级别(可序列化) 我的问题是:Sql TABLOCKX与可序列化,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一系列需要原子化运行的T-SQL查询。(见下文)。。。其目的是允许一个用户一次检索一个唯一的行,并防止其他用户同时检索同一行 到目前为止,我看到了两种可能的解决办法。1) 表提示(HOLDLOCK、TABLOCKX)和2)事务隔离级别(可序列化) 我的问题是: 哪种选择更好 还有其他/更好的解决方案吗 在这种情况下, HOLDLOCK=SERIALIZABLE=duration,并发 TABLOCKX=独占表锁 这两个概念是不同的,都不是你想要的 要执行所需操作,您需要强制执行非阻塞(r
- HOLDLOCK=SERIALIZABLE=duration,并发
- TABLOCKX=独占表锁
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
通常,锁有3个方面
- 粒度=锁定的内容=行、页、表(
)PAGLOCK、ROWLOCK、TABLOCK
- 隔离级别=锁持续时间、并发性(
)HOLDLOCK、READCOMMITTED、REPEATABLEREAD、SERIALIZABLE
- 模式=共享/排他性(
)UPDLOCK,XLOCK
- “组合”例如
NOLOCK、TABLOCKX
- 选择正确的群集密钥(关键!)
- 使用输出子句
- 使用readpass
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