2014-04-07 41 views
17

實體框架6引入了一種新的方式,以支持的DbContext交易與BeginTransaction方法:DbContextTransaction回滾

var db = new MyDbContext(); 
using(var tx = db.Database.BeginTransaction()) 
{ 
    // update entities 
    try 
    { 
     db.SaveChanges(); 
     tx.Commit(); 
    } 
    catch(Exception) 
    { 
     tx.Rollback(); 
    } 
} 

在方法回滾()調用有必要嗎?如果沒有調用異常,會發生什麼?我知道在使用TransactionScope時,它會在處置完成時自動回滾事務,並且不會調用Complete。 DbContextTransaction的行爲是否類似?

回答

25

不,不需要顯式調用回滾。 tx變量將在using塊完成時處理,如果Commit()沒有被調用,事務將被回滾。

我已經使用SQL Server活動監視器測試了這一點,通過觀察數據庫對象上的鎖,以及查詢數據庫以觀察數據何時回滾,使用select語句中的nolock提示是能夠查看數據庫中未提交的更改。
例如select top 10 * from [tablename] (nolock) order by modifiedDate

+3

我做了測試並得到了相同的結果,但是我沒有找到任何有關回滾處理事務的文檔。 –