2014-04-09 121 views
0

我有一組關於EF 6.我用下面的代碼模板,我的數據庫查詢事務的使用問題工作:與實體框架6個交易

using (var ctx = new MyContext(connectionString)) 
{ 
    using (var tx = ctx.Database.BeginTransaction(IsolationLevel.Snapshot)) 
    { 
      try 
      { 
       // query database 
       ctx.SaveChanges(); 
       tx.Commit(); 
      } 
      catch(Exception ex) 
      { 
       tx.Rollback(); 

       if(ex is A) // handle A 
       if(ex is B) // handle B     

       throw; 
      } 
    } 
} 
  • 我會查詢數據庫只有一次,只需調用SaveChanges()一次。發生異常時是否需要回滾事務?

  • 我的一些交易只會讀取數據,所以我不會調用SaveChanges()。在這種情況下,我還應該撥打Commit()嗎?

  • 我正在考慮使用SqlAzureExecutionStrategy來實現連接彈性。有一點發生瞬時故障?它只是在執行查詢或調用SaveChanges()期間?如何初始化ctx,tx,並致電Commit()?他們能造成這樣的失敗嗎?

  • 是否有一種不太緊湊的查詢事務內數據庫的方式?對於每一個單獨的查詢,我需要使用上面的代碼模板,這些代碼模板顯着地重複了代碼,例如兩個using語句,try-catch塊和一般異常處理。我相信最後一個可以通過從SqlAzureExecutionStrategyDbExecutionStrategy得到。我儘可能地重構代碼。

回答

0

您不必在實體框架中實際使用事務。

默認隔離模式是讀取提交的,完全符合您的需求的99%,例如。讀數據。當您想要保存對數據庫所做的更改(創建,更新,刪除)時,EntityFramework足夠聰明,可以創建一個事務,而不需要在幕後通知以包裝更改。你可以確定所有的東西都會被保存下來,或者每一個變化都會被丟棄(Atomicity)。

看這裏https://coderwall.com/p/jnniww

  • 當你調用的SaveChanges,相信實體框架將在一個事務中執行所有這些操作。當發生異常時,它會自動回滾。所以,你不必打電話回滾。或使用交易。
  • 實體框架內部處理事務,當您必須在多個數據庫上執行操作時可以使用它
  • 我不知道這個SqlAzureExecutionStrategy for connection resiliency。但是,該功能由新的ADO.Net空閒連接彈性在.NET框架4.5.1 http://blogs.msdn.com/b/dotnet/archive/2013/10/17/net-framework-4-5-1-rtm-gt-start-coding.aspx

基本實體框架操作區塊補充..

using (var context = new ProductContext()) 
{ 
    try 
    { 
     // Perform data access using the context 
     context.SaveChanges(); 
    } 
    catch(Exception ex) 
    { 
     //handle exception 
    } 

} 

希望它可以幫助你,祝你今天愉快。

+0

我知道EF提供的默認事務不能防止不可重複讀取和幻像行。 – Mark13426

+0

也可能有些情況需要包含多個上下文。SaveChanges()'在更廣泛的事務中。 – Nathan