当行已被锁定以进行更新时,SQL Server 是否可以使用 NoWait 读取已提交的数据?
我创建了一个名为“Tbl”的表
CREATE TABLE [dbo].[Tbl](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Detail] [varchar](50) NULL)
插入几行。
insert into Tbl(Detail) values ('1D')
insert into Tbl(Detail) values ('2D')
insert into Tbl(Detail) values ('3D')
insert into Tbl(Detail) values ('4D')
现在,我在 SSMS 中将隐式事务设置为 true。(工具 -> 选项 -> SQL Server -> ANSI。
然后,在一个会话(打开的新查询窗口)中执行更新语句,该语句应该在该行上放置一个排他锁。
UPDATE dbo.tbl SET Detail = '9D' where Id = 1
现在,在另一个会话中,我想选择已提交的行。如果我执行,
SELECT * FROM dbo.tbl with(READCOMMITTED,NOWAIT)
, 抛出异常(Lock Request Timeout Period Exceed)
它可能试图在另一个会话已经应用独占锁的行上应用共享锁。从而得到异常。
现在,这是一个常见的场景,其中一个事务需要很长时间来更新大行。我应该能够在另一个会话中看到提交的数据而无需等待。
在 SQL Server 中实现这一点需要什么类型的提示?