2013-07-03 55 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

相關問題