2016-09-30 57 views
0

我有一個SQL Server 2012數據庫Set Allow Snapshot Isolation = TRUE。我們稱之爲DBSnapSQL 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上的鎖?

謝謝

格雷姆·布萊克

回答

0

我無法重現這個在我結束。當然,我正在運行SQL Server 2016而不是2012.我嘗試按照您的建議創建視圖,並且我收到了與直接查詢數據庫相同的錯誤。

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. 

以下MSDN報價似乎表明,不應該出現你描述的行爲:

If a transaction using the SNAPSHOT isolation level accesses data in multiple databases, ALLOW_SNAPSHOT_ISOLATION must be set to ON in each database.

(從https://msdn.microsoft.com/en-us/library/ms173763(v=sql.110).aspx

你可以嘗試啓動兩個新的數據庫,使快照隔離在其中之一中,然後按照上述過程查看是否得到相同的結果。如果是這樣,請保存您使用的SQL並更新您的問題。這樣其他人可能會有更好的運氣來複制你的情況。

0

我的歉意,我的貼子不正確。我沒有意識到我用來測試的視圖中嵌入了(NOLOCK),因此覆蓋了快照。

+1

這確實回答了有關如何在支持和不支持快照隔離的數據庫之間加入的另一個相關問題。事務級別隔離可以通過表級別提示進行覆蓋,例如(NOLOCK)或(READCOMMITTED)以允許加入工作。表中具有快照隔離的部分查詢將使用行版本控制(即,您可以將一行插入到該表中而不鎖定),而具有表提示的部分將遵循指定的任何隔離級別。這是在連接中「混合」隔離級別的好方法。 –

+0

我沒有想過這個,這是一個非常有趣的解決方案!當使用表提示查詢視圖時,我能夠使其工作,但當提示位於視圖內部時出於某種原因無法使用。我想知道它是否依賴於SQL Server是否決定遵循提示。無論如何,感謝分享! – Soukai