2013-07-03 52 views
1

当SQL Server已经锁定更新时,SQL Server是否可以使用NoWait读取已提交的数据?在没有等待SQL Server的情况下读取已提交的数据

我创建了一个名为 “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服务器 - > ANSI

然后,在一个会话(打开新的查询窗口)执行更新语句,它应该把一个排它锁在该行

UPDATE dbo.tbl SET Detail = '9D' where Id = 1 

现在,在另一个会议上,我想选择提交的行。如果我执行,

SELECT * FROM dbo.tbl with(READCOMMITTED,NOWAIT),它抛出异常(锁定请求超时时间连续超过)

它可能试图在那里已经应用的另一个会话行申请共享锁EXC可笑的锁。因此得到例外。

现在,这是一个常见的情况,其中一个事务需要很长时间来更新巨大的行。我应该可以在另一个会话中看到提交的数据而无需等待。

需要什么类型的HINT才能在SQL Server中实现这一点?

+1

投票迁移到DBA.StackExchange – swasheck

+0

我想你想['READPAST'(http://msdn.microsoft.com/en-us/library/ms187373.aspx) –

+1

@TI READPAST不会这样做,它完全跳过脏记录。我不认为有任何方法。 –

回答

8

这仅适用于SNAPSHOT隔离(或读取承诺快照模式)的形式。您需要先在数据库上启用它。

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

+0

你打败了我。 – swasheck

3

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

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

I recently had to learn about this

相关问题