在sqlserver中with nolock 詳解

2021-09-06 01:52:16 字數 1777 閱讀 5110

在查詢語句中使用 nolock 和 readpast

處理乙個資料庫死鎖的異常時候,其中乙個建議就是使用 nolock 或者 readpast 。有關 nolock 和 readpast的一些技術知識點:

對於非銀行等嚴格要求事務的行業,搜尋記錄中出現或者不出現某條記錄,都是在可容忍範圍內,所以碰到死鎖,應該首先考慮,我們業務邏輯是否能容忍出現或者不出現某些記錄,而不是尋求對雙方都加鎖條件下如何解鎖的問題。

nolock 和 readpast 都是處理查詢、插入、刪除等操作時候,如何應對鎖住的資料記錄。但是這時候一定要注意nolock 和 readpast的侷限性,確認你的業務邏輯可以容忍這些記錄的出現或者不出現:

簡單來說:

nolock 可能把沒有提交事務的資料也顯示出來.

readpast 會把被鎖住的行不顯示出來

不使用 nolock 和 readpast ,在 select 操作時候則有可能報錯誤:事務(程序 id **)與另乙個程序被死鎖在 鎖 資源上,並且已被選作死鎖犧牲品。

下面就來演示這個情況。

為了演示兩個事務死鎖的情況,我們下面的測試都需要在sql server management studio中開啟兩個查詢視窗。保證事務不被干擾。

演示一 沒有提交的事務,nolock 和 readpast處理的策略:

查詢視窗一請執行如下指令碼:

create table t1 (c1 int identity(1,1), c2 int)

gobegin transaction

insert t1(c2) values(1)

在查詢視窗一執行後,查詢視窗二執行如下指令碼:

select count(*) from t1 with(nolock)

select count(*) from t1 with(readpast)

結果與分析:

查詢視窗二依次顯示統計結果為: 1、0

查詢視窗一的命令沒有提交事務,所以 readpast 不會計算沒有提交事務的這一條記錄,這一條被鎖住了,readpast 看不到;而nolock則可以看到被鎖住的這一條記錄。

如果這時候我們在查詢視窗二中執行:

select count(*) from t1 就會看到這個執行很久不能執行完畢,因為這個查詢遇到了乙個死鎖。

清除掉這個測試環境,需要在查詢視窗一中再執行如下語句:

rollback transaction

drop table t1

演示二:對被鎖住的記錄,nolock 和 readpast處理的策略

這個演示同樣需要兩個查詢視窗。

請在查詢視窗一中執行如下語句:

create table t2 (userid int , nickname nvarchar(50))

goinsert t2(userid,nickname) values(1,'郭紅俊')

insert t2(userid,nickname) values(2,'蟈蟈俊')

gobegin transaction

update t2 set nickname = '蟈蟈俊.net' where userid = 2

請在查詢視窗二中執行如下指令碼:

select * from t2 with(nolock) where userid = 2

select * from t2 with(readpast) where userid = 2

結果與分析:

查詢視窗二中, nolock 對應的查詢結果中我們看到了修改後的記錄,readpast對應的查詢結果中我們沒有看到任何一條記錄。這種情況下就可能發生髒讀

在SQLSERVER中讀取Oracle中的資料

在sqlserver 中讀取oracle 中的資料 作者 林清清日期 2006 2 13 要求 在ms sql server2000 資料庫中連線並讀取 oracle9i 資料庫中的資料.假設 目標oracle 資料庫相關引數如下 table name table1 oracle ip 172.18...

在SQLSERVER中建立DBLINK

配置sqlserver資料庫的dblink exec sp addlinkedserver server was sms srvproduct provider sqloledb datasrc 10.131.20.100 exec sp addlinkedsrvlogin was sms fals...

write在sqlserver中的使用

我用乙個簡單的例子來說明一下 下面是乙個表 declare table table id int identity 1,1 window nvarchar max insert into table window select aaaa1111 union all select aaa111 uni...