2013-01-16 156 views
2

我很好奇在數據庫上使用SET READ_COMMITTED_SNAPSHOT ON使用IsolationLevel.Snapshot的效果。 IsolationLevel枚舉的documentation注意到了快照隔離的行爲,這不是我們要查找的情況。ADO.Net IsolationLevel.Snapshot SET SET READ_COMMITTED_SNAPSHOT ON

啓用READ_COMMITTED_SNAPSHOT後,我們應該指定IsolationLevel.Unspecified還是不提供此值?或者,如果我們指定IsolationLevel.Snapshot,我們是否會意識到READ_COMMITTED_SNAPSHOT啓用時的行爲?

謝謝!

回答

1

如果在數據庫級別啓用了read_committed_snapshot,則所有查詢都將具有該默認隔離級別,除非進行修改。

如果您更改查詢本身的隔離級別,則查詢將使用您修改它的隔離級別。

+0

瞭解。我想我的問題確實是LLBLGen的問題之一。該工具需要在構建Transaction實例時提供IsolationLevel。需要了解什麼值會導致庫使用數據庫的默認值。 –

1

我已經做了SQL 2008 R2和Entity Framework 4 以下測試(數據庫對READ_COMMITTED_SNAPSHOT選項)

我創建了以下存儲過程返回上下文隔離級別(原從here):

Create Procedure TempTestIsolation 
AS 
Begin 
    DECLARE @UserOptions TABLE(SetOption varchar(100), Value varchar(100)) 
    INSERT @UserOptions 
    EXEC('DBCC USEROPTIONS WITH NO_INFOMSGS') 

    SELECT Value 
    FROM  @UserOptions 
    WHERE  SetOption = 'isolation level' 
End 

然後我編寫了以下測試:

static void Main(string[] args) 
{ 
    var entities = new MyEntities(); 
    // Execute the SP to get the isolation level 
    string level = entities.TempTestIsolation().First().Value; 
    Console.WriteLine("Without a transaction: " + level); 

    var to = new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.Snapshot }; 
    using (var ts = new TransactionScope(TransactionScopeOption.Required, to)) 
    { 
     // Execute the SP to get the isolation level 
     level = entities.TempTestIsolation().First().Value; 
     Console.WriteLine("With IsolationLevel.Snapshot: " + level); 
    } 

    to = new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted }; 
    using (var ts = new TransactionScope(TransactionScopeOption.Required, to)) 
    { 
     // Execute the SP to get the isolation level 
     level = entities.TempTestIsolation().First().Value; 
     Console.WriteLine("With IsolationLevel.ReadCommitted: " + level); 
    } 
    Console.ReadKey(); 
} 

衛生組織Ë產量爲: Test output

正如你所看到的,當你在你TransactionOptions設置的IsolationLevel快照,存儲過程的「快照」隔離級別下執行,並下「讀取提交的快照「。

相反,如果你設置了的IsolationLevelREADCOMMITTED正在執行 「讀提交快照」。

希望它有幫助。