【发布时间】:2021-10-18 18:16:11
【问题描述】:
假设我在两个单独的 SSMS 查询窗口中有以下查询:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRANSACTION
UPDATE dbo.Jobs
SET [status] = 'Running'
OUTPUT Inserted.*
WHERE [status] = 'Waiting'
--I'm NOT committing yet
--Commit Transaction
我运行查询窗口 1(但不提交),然后运行查询窗口 2。
我希望查询窗口 2 仅更新在我开始查询 1 后插入的行(所有新记录的状态为“等待”)。但是,SQL Server 正在等待第一个查询完成,因为在更新语句中它没有读取脏值(即使它设置为 READ UNCOMMITTED);
有没有办法克服这个问题?
在我的应用程序中,我将有 2 个(或更多)进程运行它,我希望进程 2 应该能够拾取进程 1 尚未拾取的行;我不希望进程 2 需要等到进程 1 完成
【问题讨论】:
-
在我的应用程序中,我将有 2 个(或更多)进程运行它,我希望进程 2 应该能够拾取进程 1 尚未拾取的行;我不希望进程 2 需要等到进程 1 完成
-
状态列的基数是多少,有多少行可能处于任一状态?
-
可能每个状态都以50开头;随着时间的推移,它会变得更多
-
我不相信你在这里想要
read uncommitted,你只需要跳过已经被事务锁定的行,你可以使用with(readpast)提示来完成 -
解决方案可能是变得更严格,而不是更少,并确保每个操作尽可能短。这可能意味着将现有的长时间运行的作业分解为更小的幂等步骤。
标签: sql sql-server tsql nolock