Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql TABLOCKX与可序列化_Sql_Sql Server_Tsql - Fatal编程技术网

Sql TABLOCKX与可序列化

Sql TABLOCKX与可序列化,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一系列需要原子化运行的T-SQL查询。(见下文)。。。其目的是允许一个用户一次检索一个唯一的行,并防止其他用户同时检索同一行 到目前为止,我看到了两种可能的解决办法。1) 表提示(HOLDLOCK、TABLOCKX)和2)事务隔离级别(可序列化) 我的问题是: 哪种选择更好 还有其他/更好的解决方案吗 在这种情况下, HOLDLOCK=SERIALIZABLE=duration,并发 TABLOCKX=独占表锁 这两个概念是不同的,都不是你想要的 要执行所需操作,您需要强制执行非阻塞(r

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

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

我的问题是:

  • 哪种选择更好

  • 还有其他/更好的解决方案吗

  • 在这种情况下,

    • HOLDLOCK=SERIALIZABLE=duration,并发
    • TABLOCKX=独占表锁
    这两个概念是不同的,都不是你想要的

    要执行所需操作,您需要强制执行非阻塞(readpass)独占(UPDLOCK)行级别(ROWLOCK)锁,。您还可以使用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
    
    通常,锁有3个方面

    • 粒度=锁定的内容=行、页、表(
      PAGLOCK、ROWLOCK、TABLOCK
    • 隔离级别=锁持续时间、并发性(
      HOLDLOCK、READCOMMITTED、REPEATABLEREAD、SERIALIZABLE
    • 模式=共享/排他性(
      UPDLOCK,XLOCK

    • “组合”例如
      NOLOCK、TABLOCKX

    您描述的是典型的队列处理,既不需要tablockx,也不需要serializable,它们实际上也不会工作。我建议你去部门内部讨论一下什么是可能的,什么是不可能的。其要点是:

    • 选择正确的群集密钥(关键!)
    • 使用输出子句
    • 使用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