小编bri*_*ing的帖子

为什么我们的查询突然返回不该返回的行(使用 READPAST 和 UPDLOCK 选项)?

我们有一个看起来像这样的工作表

CREATE TABLE [dbo].[Clearing](
    [Skey] [decimal](19, 0) IDENTITY(1,1) NOT NULL,
    [BsAcctId] [int] NULL,
    [Status] [varchar](20) NULL,
     CONSTRAINT [csPk_Clearing] PRIMARY KEY CLUSTERED ( [Skey] ASC ) 
) 
Run Code Online (Sandbox Code Playgroud)

像这样的覆盖索引

CREATE NONCLUSTERED INDEX [IX_Status] ON [dbo].[Clearing]
(
    [Status] ASC
)
INCLUDE ( [Skey], [BsAcctId])
Run Code Online (Sandbox Code Playgroud)

我们使用这个查询来选择下一个工作

select top (1) Skey, BsAcctId, Status from Clearing with ( readpast, updlock )
  where (Clearing.Status = 'NEW')
  order by Clearing.Skey
Run Code Online (Sandbox Code Playgroud)

(真实表大约有 10 列。它们都在索引 include() 子句和选择列列表中。)

执行计划非常简单。它使用 IX_Status 进行索引查找,然后使用顶级运算符。由于索引按 (status, skey) 排序,因此计划不需要排序。

该表位于 AlwaysOn 可用性组中的数据库中。该组有 2 个数据库服务器。(这是一个测试系统。)

通常这个表和查询工作得很好。所以我们去应用 Windows …

sql-server concurrency queue availability-groups

4
推荐指数
2
解决办法
384
查看次数