首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TABLOCKX诉SERIALIZABLE

TABLOCKX诉SERIALIZABLE
EN

Stack Overflow用户
提问于 2011-02-07 18:17:14
回答 2查看 3.2K关注 0票数 4

我有一系列T查询,需要原子地运行。(见下文)..。其目的是允许一个用户一次检索一个唯一的行,并防止其他用户同时检索同一行。

到目前为止,我已经看到了两种可能的解决办法。1)表提示(HOLDLOCK,TABLOCKX)和2)事务隔离级别(SERIALIZABLE)

我的问题:

  1. 哪种选择更好?
  2. 还有其他/更好的解决办法吗?
代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-07 18:29:54

在这种情况下,

  • HOLDLOCK = SERIALIZABLE =持续时间,并发
  • TABLOCKX =排他表锁

这两个概念是不同的,也不是你想要的。

要执行您想做的事情,要执行避免比赛条件,需要强制非阻塞(READPAST)独占(UPDLOCK)行级(行锁)锁。还可以使用OUTPUT子句使其成为一个将是原子语句的语句。这个音阶很好。

代码语言:javascript
复制
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 )
票数 8
EN

Stack Overflow用户

发布于 2011-02-07 18:55:39

您描述的是典型的队列处理,不需要tablockx,也不需要可序列化,也不需要它们实际工作。我建议您通过将表用作队列进行深入的讨论,讨论什么是可能的,什么是不可能的。它的主旨是:

  • 选择适当的集群键(关键!)
  • 使用输出子句
  • 使用READPAST
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4924861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档