首页 > 解决方案 > 更新第二张表时,一张表可以拥有排他锁吗?

问题描述

我在 SQL Server 2016 中工作。我有两个表,一个是工作项队列 ( TQueue),第二个是TWork正在处理的工作项 ( )。

我有一个脚本,可以从中获取前 100 个TQueue没有记录的TWork项目,然后将这些项目插入TWork以进行处理。

出于性能原因,我想同时运行脚本的多个实例。挑战在于脚本 1 抓取 100 个项目,并且在提交将这些项目插入其中的事务之前TWork,脚本 2 获取同一组项目并将它们也插入。

问题

我想阻止读取TQueue直到插入事务TWork完成。这可能吗?

标签: sql-server

解决方案


您可以使用表格提示来实现此目标。

例如:

Create Table Val (ID Int)

Insert Into Val (ID)
Values (0),(1),(2),(3),(4),(5)

第一届:

Set Transaction Isolation level Read Committed

Begin Transaction

Select Top 2 * From Val With (ReadPast, XLock, RowLock)
-- Return 0,1

-- Commit has been commented for illustrative purposes.
-- Don't forget to commit the transaction later.

-- Commit 

第二届:

Set Transaction Isolation level Read Committed

Begin Transaction

Select * From Val With (ReadPast, XLock, RowLock)
-- Return 2,3,4,5

Commit 

推荐阅读