程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> sqlserver中with(nolock)深刻剖析

sqlserver中with(nolock)深刻剖析

編輯:MSSQL

sqlserver中with(nolock)深刻剖析。本站提示廣大學習愛好者:(sqlserver中with(nolock)深刻剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是sqlserver中with(nolock)深刻剖析正文


在查詢語句中應用 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)
go
BEGIN 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))
go
insert t2(UserID,NickName) values(1,'郭紅俊')
insert t2(UserID,NickName) values(2,'蝈蝈俊')
go
BEGIN 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對應的查詢成果中我們沒有看就任何一筆記錄。這類情形下便可能產生髒讀
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved