1

当行已被锁定以进行更新时,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 中实现这一点需要什么类型的提示?

4

2 回答 2

8

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

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

于 2013-07-03T20:09:09.483 回答
3

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

我能想到的最好的事情是在数据库上启用已提交的读取快照隔离。这样做的目的是在语句开始时为您提供行。

我最近不得不了解这个

于 2013-07-03T20:12:43.003 回答