使用隔離級別爲「讀取已提交快照」的SQL服務器,我們經常將數據寫入數據庫並在同一事務的上下文中進一步讀取。通常在從數據庫讀取數據時,我們會看到我們自己未提交的更改,但只能確定其他人所做的更改。我們假設這是預期的行爲。SQL Server - 讀取同一事務的未提交更改時的行爲不一致
我們現在發現,在一些比較罕見的情況下,我們看不到我們編寫的值 - 只有以前提交的值。
任何想法可能會導致不一致?
使用隔離級別爲「讀取已提交快照」的SQL服務器,我們經常將數據寫入數據庫並在同一事務的上下文中進一步讀取。通常在從數據庫讀取數據時,我們會看到我們自己未提交的更改,但只能確定其他人所做的更改。我們假設這是預期的行爲。SQL Server - 讀取同一事務的未提交更改時的行爲不一致
我們現在發現,在一些比較罕見的情況下,我們看不到我們編寫的值 - 只有以前提交的值。
任何想法可能會導致不一致?
事實證明,這是SQL Server的一個已知不一致:當你從數據庫讀取通常會看到您自己的事務未提交的更改(在所有隔離級別中),但這並不總是有保證的。在我的情況下,解決方法是使用with (readuncommitted)
,信任應用程序級鎖定機制,防止同一數據的同時修改。
我收到了兩位獨立數據庫專家的相同答案。不幸的是,我沒有找到任何關於這個問題的書面參考。
這是一些關於可能出錯的好文章。也許他們可以幫助
Craig Freedman, Serializable vs. Snapshot Isolation Level 黑色/白色大理石比喻
Hugo Kornelis, 4 articles "Snapshot isolation: A threat for integrity":DRI/FKS悄悄更改爲不同的隔離級別
不錯的文章,但他們不討論閱讀在同一交易中修改的數據的問題。 – 2009-04-22 13:19:14