為什麼NOLOCK查詢提示是個不明智的想法

2021-09-26 05:39:10 字數 1904 閱讀 2718

一些人總當nolock查詢提示是sql server裡的加速器,因為它避免了大量的死鎖情景。在這篇文章裡,我想向你展示下為什麼nolock查詢提示是個不好的想法。

nolock查詢提示乙個最大的***就是在你的記錄集會出現所謂的髒讀這個事實。我們來看下面的**:

1

begin

transaction23

update

person.person

4set firstname =

'james'5

where lastname =

'jones

'

如你所見,我開始了乙個新的事務,對adventureworks2012資料庫裡的person.person表進行update語句。現在當你嘗試同時在另乙個會話裡讀取這個記錄時,這個select語句會阻塞——在這個情況下請求的共享鎖(s)會被已經授予的排它鎖(x)阻塞——寫阻塞讀操作。

1

select

2firstname,

3lastname

4from

person.person

5where lastname =

'jones'6

go

一些人現在回應用sql server裡的加速器,使用nolock

1

select

2firstname,

3lastname

4from person.person with (nolock) --

it's a kind of magic...

5where lastname =

'jones'6

go

如你所見死鎖情景馬上解決了,你從sql server返回記錄了——遺憾的是在你面前現在有髒讀(dirty read):你讀取了尚未提交的資料。假設現在用update語句的第1個事務回滾了:在這個情況下,你已讀取的資料在sql server裡邏輯上是從未存在的。

因此nolock查詢提示並不是在每個情景都是有用的。 如果你想執行乙個報表,或者你只想快速返回結果,記錄不用100%正確,這「可以是」個可取的(考慮下一天的平均銷售額)。當然,當你需要精確的結果,nolock並不可取。當然也有一些特定場景即使nolock也會阻塞。

有人給我提了為什麼nolock查詢提示基本是乙個不方便的(no-go)的選擇:你不能在明顯的方式裡切換你的資料庫查詢到讀提交快照隔離(read committed snapshot isolation (rcsi))。我從未想過這個情景,但沒錯是對的。讀提交快照隔離(read committed snapshot isolation (rcsi))是個資料庫選項。當你啟用它的時候,每個查詢都是在新的讀提交快照樂觀隔離級別裡——只要在你的事務裡不指定任何隔離級別。

對於特定的sql語句使用nolock查詢提示,你臨時修改隔離級別為未提交讀(read uncommitted)。因此sql語句也不會從讀提交快照隔離受益,因為語句並沒有在預設的提交讀( read committed)隔離執行。這就對了!當你下次寫下神奇的……with(nolock)……時,好好想下這個額外引數。

使用nolock查詢提示執行每個查詢並不都有意義。一方面你會通過髒讀(dirty reads)返回不一致的資料。另一方面你不能從讀提交快照隔離(read committed snapshot isolation (rcsi))樂觀隔離級別裡受益,因為你臨時修改了你sql語句的預設隔離級別。

感謝關注!

為什麼是 pgsql ?

postgresql在國外很流行 在日本是僅次於apache的開源軟體 pgsql 使用程序 postgresql資料庫是多程序的架構.每乙個客戶連線都有乙個服務程序為其進行服務,也有共享記憶體,這一點是與orancle資料庫是相似的.postgresql使用一種客戶端 伺服器的模式.乙個伺服器程序...

為什麼是XML

乙個人倒是可以隨便很多,大概是票價 的原因,今天的參加者不多,也沒遇見熟人。一天下來,思維不斷的轉換,人也有點迷迷糊糊了。最後一場,居然趕錯了會場,開講才知道是db2的講座,主講王先生是 ibm 的 fellow,以前聽過幾次他的演講,沒什麼深刻印象,今天他講 db2 和 xml。這幾年來,偶和 x...

為什麼是XML?

為什麼是xml 1 並不建議現在的edi 標準被直接對映成xml 來實現,重要的目的是抽取豐富的語義並應用在基於xml 的應用計算技術中。當使用xml 實現這種電子商務解決方案時,這種融合叫做xml edi。無論你是否理解edi 語法,我能肯定你一定確信使用xml 會使獲取過程的會話更易讀懂。但是還...