Sql-Server
如果我們在 sql-server 中啟用已送出的讀取快照會有什麼風險?
我在這裡讀到,每行將儲存一些額外的數據,因此我們可能會看到性能下降,但還有哪些其他風險?
例如。這會影響數據庫的恢復嗎?我們還需要做些什麼來利用這一點嗎?
我計劃執行這些命令:
ALTER DATABASE DatabaseName SET READ_COMMITTED_SNAPSHOT ON ALTER DATABASE DatabaseName SET ALLOW_SNAPSHOT_ISOLATION ON
我相信這將使我們更接近 Oracle,如果一個事務正在更新其他事務仍然可以讀取舊數據。它是否正確?
我正在研究這個問題,因為我厭倦了 SQL Server 2005 中的鎖定問題。我希望這可以減少使用者偶爾看到的死鎖,幫助我們的應用程序的整體性能,並鼓勵我們的開發人員在每個事務中執行多個操作而不恐懼。
概括
- 如果您有鎖定問題,那麼您的程式碼就有問題:它不是數據庫引擎
- 這不是靈丹妙藥
- 您可能會添加更多問題
載入
它還會增加 tempdb 和CPU的負載。另見:
- “性能影響:Read_Committed_Snapshot 的潛在成本”(Linchi Shea)
安全
最重要的是,預設情況下,快照隔離在許多情況下並不安全。閱讀“快照隔離”(維基百科)以了解有關寫入偏斜異常的更多資訊。下一節是“使快照隔離可序列化”來解決這個問題。
因此,一般而言,快照隔離將一些維護重要約束的問題交給了使用者,他們可能既不了解潛在的陷阱,也不了解可能的解決方案。這種轉移的好處是更好的性能。
另見:
- “讀取送出的快照隔離級別的潛在危險”(JimMcLeod,Alex Kuznetsov 的評論中有爭議)
- 死鎖!:“讀取送出的快照”解釋(Nick Berardi)
- 可序列化與快照隔離級別,大理石問題(Craig Freedman)
- READ_COMMITTED_SNAPSHOT 下涉及 UDF 的讀取可能看起來不一致(Alex Kuznetsov)