我有一組關於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塊和一般異常處理。我相信最後一個可以通過從
SqlAzureExecutionStrategy
或DbExecutionStrategy
得到。我儘可能地重構代碼。
我知道EF提供的默認事務不能防止不可重複讀取和幻像行。 – Mark13426
也可能有些情況需要包含多個上下文。SaveChanges()'在更廣泛的事務中。 – Nathan