2

最近使用READ_COMMITTED_SNAPSHOT,我們的用戶有時會得到超時過期錯誤,當他們要更新數據庫的一些紀錄。(我認爲像僵局DB時) 我們的數據庫是SQL Server 2008 R2,我們的應用程序首先由EF5代碼開發。與EF代碼第5

今天我讀了一篇關於在SQL Server中使用READ_COMMITTED_SNAPSHOT選項的文章,我認爲這個選項可以幫助我們防止DB中的死鎖。 Occording這篇文章中,它有兩個步驟:

1中的代碼在DB

激活 READ_COMMITTED_SNAPSHOT
ALTER DATABASE testDatabase SET ALLOW_SNAPSHOT_ISOLATION ON; 
ALTER DATABASE testDatabase SET READ_COMMITTED_SNAPSHOT ON; 

2-使用READ_COMMITTED_SNAPSHOT選項:

using (var transactionScope = 
new TransactionScope(TransactionScopeOption.Required, 
new TransactionOptions { IsolationLevel= IsolationLevel.Snapshot })) 
{ 
    // update some tables using entity framework 
    context.SaveChanges(); 
    transactionScope.Complete(); 
} 

該樣本,使用TransactionScop聲明。但我們沒有使用TransactionScop來管理Transactions。例如我們在我們的模型中有繼承,並且當我們調用.SaveChange()時,EF自己創建和管理Transaction

有什麼辦法可以使用READ_COMMITTED_SNAPSHOT而不使用TransactionScop聲明?

+2

從我的測試中,如果在TransactionOptions設置_IsolationLevel.Snapshot_,它將覆蓋數據庫設置和交易將在_Snapshot_隔離級別執行,而不是_ReadCommittedSnapshot_ – thepirat000

回答

0

您可以在不TransactionScope開始交易,做到這一點的使用DbContextConnection屬性:

public static DbTransaction BeginTransaction(this DbContext context, IsolationLevel isolationLevel) 
{ 
    if (context.Database.Connection.State != ConnectionState.Open) 
     context.Database.Connection.Open(); 
    return context.Database.Connection.BeginTransaction(isolationLevel); 
} 
+0

,我怎麼能使用此代碼與.SaveChanges()? – Masoud