簡體   English   中英

WITH(NOLOCK)與SET事務隔離級別的讀取未提交

[英]WITH (NOLOCK) vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

有人可以就何時應該使用WITH (NOLOCK)而不是SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED向我提供一些指導SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

每個優點/缺點是什么? 使用一種相對於另一種會遇到意外后果嗎?

他們是一樣的東西。 如果使用set transaction isolation level語句,則該語句將應用於連接中的所有表,因此,如果您只想在一個或兩個表上使用nolock ,則使用該nolock 否則使用其他。

兩者都會給你臟讀。 如果您對此表示滿意,請使用它們。 如果您不能進行臟讀,請考慮使用snapshot或可serializable提示。

WITH(NOLOCK)是表級別的提示。 將事務隔離級別設置為READ_UNCOMMITTED會影響連接。 區別在於范圍。 請參閱此處的SQL Server文檔中的READUNCOMMITTED和NOLOCK:

http://technet.microsoft.com/zh-CN/library/ms187373.aspx

對於事務隔離級別: http : //technet.microsoft.com/zh-cn/library/ms173763.aspx

  • NOLOCK在表本地(或視圖等)
  • READ UNCOMMITTED是每個會話/連接的

至於指導...從StackOverflow和電氣網絡中隨機搜索...

據我所知,唯一的區別是作用范圍如斯特羅米所說。 在表上提示NOLOCK,在會話上提示READ UNCOMMITTED。

至於可能發生的問題,全都與一致性有關。 如果您在乎的話,請注意您會得到所謂的臟讀,這可能會影響對不正確信息進行操作的其他數據。

我個人認為我沒有看到任何問題,但這可能更多是由於我使用nolock的原因。 您需要注意,在某些情況下可以使用它。 場景中,您主要是向表中添加新數據,但后面有另一個過程來檢查數據場景。 這可能是可以的,因為主要流程不包括在讀取過程中返回和更新行。

我也相信這些天您應該研究多版本並發控制。 我相信他們在2005年添加了它,它通過為讀者提供要使用的數據庫快照來幫助阻止作者阻止讀者。 我將提供一個鏈接,並將進一步的研究留給讀者:

MVCC

數據庫隔離級別

您不能在視圖中使用“未提交設置事務隔離級別讀取”(實際上只能有一個腳本),因此,如果應包括臟行,則必須使用(nolock)。

由於您必須對每個表使用WITH(NOLOCK),因此在每個FROM或JOIN子句中寫入它可能會很煩人。 但是,將其稱為“臟”讀取有其原因。 因此,您確實應該知道何時進行操作,而不要將其設置為會話范圍的默認值。 為什么?

忘記使用WITH(NOLOCK)可能不會以非常戲劇性的方式影響您的程序,但是在某些情況下進行希望讀取的臟讀可能會有所作為。

因此,如果允許選擇的當前數據不正確,請使用WITH(NOLOCK),因為稍后可能會回滾。 當您想提高性能時,通常使用此方法,而對應用程序上下文的要求使它冒着顯示不一致數據的風險。 但是,您或負責人必須權衡使用WITH(NOLOCK)的決定的利弊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM