在SQL Server中无需等待即可读取提交的数据

时间:2013-07-03 19:53:38

标签: sql-server

当行已被锁定以进行更新时,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?

2 个答案:

答案 0 :(得分:8)

这仅以SNAPSHOT隔离(或读取提交快照模式)的形式提供。您需要先在数据库中启用它。

SNAPSHOT隔离下运行事务意味着它既不会锁定也不会等待它们。 tran看到了数据库的时间点快照。

答案 1 :(得分:3)

这不是锁定的方式。如果引擎决定升级到页面锁或表锁更有效,那么在释放锁之前,您不会读取已提交的数据。

我能想到的最好的事情是在数据库上启用读取提交的快照隔离。它的作用是它会在语句开始时为你提供行。

I recently had to learn about this