2014-03-27 92 views
0

首先抱歉,如果我的英文不好。tsql事務級別明智鎖定

我現在面臨一個問題,相對於事務隔離級別。我目前的隔離級別是讀取提交的,但它會導致表鎖定有時。 例如

create table tmp(id int,name varchar(20)) 
insert into tmp(id,name) 
values(1,'Binesh') 
     ,(2,'Bijesh') 
     ,(3,'Bibesh') 
begin transaction 
update tmp set name ='Harish' where id=2 

我試圖在另一個查詢窗口

select * from tmp where id=1 

它鎖定表,以便它不給予任何記錄,直到我回滾獲取或提交的第一個

我試圖

ALTER DATABASE db 
SET READ_COMMITTED_SNAPSHOT On 
ALTER DATABASE db 
SET ALLOW_SNAPSHOT_ISOLATION on 

它不鎖定表,但它給老id的值= 2

select * from tmp where id=2 

返回我Bijesh,我很期待鎖定

我期待的方式一樣,如果ID = 1它會正常工作,但如果ID = 2它將等待直到其他交易結束。

公司希望你的幫助.....提前

感謝

Binesh南比亞爾Ç

+0

SQL Server是**不**鎖定表 - 它被鎖定的行(帶ID值從1到3)你是剛插入。那些不能被讀取 - 直到INSERT被提交。 –

+0

使用WITH NOLOCK它將解決您的問題 – mohan111

+0

感謝您的重播,並且非常感謝您爲我編寫問題。我還認爲marc告訴我們迄今爲止(最近10年)。但是目前有些項目開始執行計劃任務中的死鎖。這導致了這個實驗。在我的示例中插入不在任何事務中。如果你有疑問嘗試一次在查詢窗口中... –

回答

0

這不是您遇到了僵局。

你的第二個查詢被阻止,因爲它必須掃描整個表。在掃描過程中,它遇到正在更新(獨佔鎖定)的行,所以它一直等到鎖被釋放(即事務結束)。

如果引擎知道這個ID列是唯一的(主鍵或唯一約束),你不會得到在這裏堵,因爲它不會對整個表做掃描,但寧願停在第一場比賽。

保持ypur交易總之,數據(索引)提供替代的訪問路徑,並儘量不要使用「SELECT *」。

而且,仔細想想你是否真的想使用讀取未提交的隔離級別。