在 ALLOW_SNAPSHOT_ISOLATION 為 OFF 時將 READ_COMMITTED_SNAPSHOT 設置為 ON
我嘗試了 SQL Server 數據庫的各種配置,最終設置
READ_COMMITTED_SNAPSHOT
為ON
whileALLOW_SNAPSHOT_ISOLATION
isOFF
。我注意到啟用此功能後,許多查詢變得更快。我仍然使用預設的
READ COMMITTED
隔離級別來連接數據庫。**這裡實際發生了什麼?我認為 when
ALLOW_SNAPSHOT_ISOLATION
isOFF
,設置READ_COMMITTED_SNAPSHOT
為ON
不會有任何影響……我實際上仍然沒有使用快照隔離,或者是嗎?**有人可以解釋一下嗎?我很困惑。我嘗試在網上研究這個主題,但每當我看到
READ_COMMITTED_SNAPSHOT
被使用時,它總是與ALLOW_SNAPSHOT_ISOLATION
我沒有啟用的 一起使用。
我注意到啟用此功能後,許多查詢變得更快。我仍然使用預設的
READ COMMITTED
隔離級別來連接數據庫。丹注意到這一點:
這些選項是獨立的,都不需要打開,儘管許多人錯誤地這樣做了。打開任何一個都會導致行版本控制成本。
READ_COMMITTED_SNAPSHOT ON
導致所有READ_COMMITTED
會話使用行版本控製而不是鎖定,這樣可以避免阻塞並可以解釋您感知的性能改進。此外,
READ_COMMITTED_SNAPSHOT
(以下稱為 RCSI)只會給你一些樂觀並發的屬性。RCSI 和快照 (SI) 在三個主要方面有所不同:
- 所有 RC 隔離查詢將立即使用 RCSI。
- RCSI 為單個語句提供數據庫的時間點(快照)視圖。
- SI 為整個事務提供時間點視圖。
- SI 可能有寫衝突。
這裡實際發生了什麼?
RCSI 已打開,因此所有 RC 隔離查詢都被提升為 RCSI,其中讀取器不會阻塞寫入器,寫入器不會阻塞讀取器。您看到的“加速”很可能是由於減少了對這些查詢的阻塞等待,因為它現在使用樂觀並發的版本儲存而不是阻塞和等待。這可能會或可能不會在您的查詢中為您提供所需的結果。
我認為 when
ALLOW_SNAPSHOT_ISOLATION
isOFF
,設置READ_COMMITTED_SNAPSHOT
為ON
不會有任何影響……我實際上仍然沒有使用快照隔離,或者是嗎?往上看。您在打開 RCSI 時使用它(這是您實際上打開的那個),但打開時不會自動使用 SI:您需要顯式
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
(或等效)使用 SI。有關詳細資訊,請參閱產品文件中的 SQL Server 數據庫引擎中基於行版本控制的隔離級別。
在這些文章中可以找到有關使用 RCSI/SI 時的一些陷阱和注意事項的其他有用細節: