我有一個SQL Server 2012數據庫Set Allow Snapshot Isolation = TRUE
。我們稱之爲DBSnap
。SQL Server隔離級別如何與視圖一起工作?
我有另一個數據庫Set Allow Snapshot Isolation = FALSE
。我們稱之爲DBRead
。
在DBSnap
,我有一個在DBREAD
創建的視圖的表(稱爲爲便於參考相同的名稱):
Create View DBReadTable
as
Select *
from DBRead.dbo.DBReadTable.
如果我執行以下命令,他們失敗了:
set transaction isolation level snapshot
Select *
from DBRead.dbo.DBReadTable
錯誤:
Msg 3952, Level 16, State 1, Line 2
Snapshot isolation transaction failed accessing database 'DBRead' because snapshot isolation is not allowed in this database. Use ALTER DATABASE to allow snapshot isolation.
但是如果我執行這些命令,基本上都在DBRead訪問數據庫中的表形成DDSnap一個觀點:
set transaction isolation level snapshot
Select *
from DBSnap.dbo.DBReadTable
它的工作原理。
第二種情況實際發生了什麼?
是否對DBRead
中的表執行DBSnap
行版本控制(即DNSnap
視圖是否包含行版本信息)?
或者是放在表DBRead
上的鎖?
謝謝
格雷姆·布萊克
這確實回答了有關如何在支持和不支持快照隔離的數據庫之間加入的另一個相關問題。事務級別隔離可以通過表級別提示進行覆蓋,例如(NOLOCK)或(READCOMMITTED)以允許加入工作。表中具有快照隔離的部分查詢將使用行版本控制(即,您可以將一行插入到該表中而不鎖定),而具有表提示的部分將遵循指定的任何隔離級別。這是在連接中「混合」隔離級別的好方法。 –
我沒有想過這個,這是一個非常有趣的解決方案!當使用表提示查詢視圖時,我能夠使其工作,但當提示位於視圖內部時出於某種原因無法使用。我想知道它是否依賴於SQL Server是否決定遵循提示。無論如何,感謝分享! – Soukai