当行已被锁定以进行更新时,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。
然后,在一个会话(Opened New Query Window)中执行update语句,其中应该在行上放置一个Exclusive Lock。
UPDATE dbo.tbl SET Detail = '9D' where Id = 1
现在,在另一个会话中,我想选择已提交的行。如果我执行,
SELECT * FROM dbo.tbl with(READCOMMITTED,NOWAIT)
,它抛出异常(锁定请求超时时间超过)
它可能试图在另一个会话已应用Exclusive Lock的行上应用共享锁。因此得到例外。
现在,这是一个常见的情况,其中One Transaction需要很长时间来更新大行。我应该能够在另一个会话中看到已提交的数据而无需等待。
在SQL Server中实现此目的需要什么类型的HINT?
答案 0 :(得分:8)
这仅以SNAPSHOT
隔离(或读取提交快照模式)的形式提供。您需要先在数据库中启用它。
在SNAPSHOT
隔离下运行事务意味着它既不会锁定也不会等待它们。 tran看到了数据库的时间点快照。
答案 1 :(得分:3)
这不是锁定的方式。如果引擎决定升级到页面锁或表锁更有效,那么在释放锁之前,您不会读取已提交的数据。
我能想到的最好的事情是在数据库上启用读取提交的快照隔离。它的作用是它会在语句开始时为你提供行。