Entity Framework中 批量提交 事務處理

ForTechnology發表於2013-05-31

Entity Framework中的批量提交與事務處理

 

在Entity Framework 中使用SaveChanges()是很頻繁的,單次修改或刪除資料後呼叫SaveChanges()返回影響記錄數。

要使用批量修改或者批量刪除資料,就需要SaveChanges(false)+AcceptAllChanges()方法了。


 SaveChanges(false) 只是通知EF需要對資料庫執行的操作,在記憶體中是屬於掛起狀態,在必要的時候是可以撤銷的,比如AcceptAllChange()提交為真正成功,EF將撤銷SaveChanges(false)的操作。


 而在處理分散式事務操作的時候,就有必要使用TransactionScope 來處理了,很多時候我們會這樣寫:

using (TransactionScope scope = new TransactionScope())
{
   
//Do something with context1
   
//Do something with context2

   
//Save and discard changes
    context1
.SaveChanges();

   
//Save and discard changes
    context2
.SaveChanges();

   
//if we get here things are looking good.
    scope
.Complete();
}
但是這樣寫是有風險的,假 

context1.SaveChanges()成功了,context2.SaveChanges()卻是有問題的,我們在scope.Complete()提交事務的時候就會終止,而Context1已經成功執行了

這可能不一定符合我們的需要。如果我們需要 context1、context2要不同時執行成功,要不都不成功,我們需要對程式碼作小小的調整,如用下面的程式碼: 

 

using (TransactionScope scope = new TransactionScope())
{
   
//Do something with context1
   
//Do something with context2

   
//Save Changes but don't discard yet
    context1
.SaveChanges(false);

   
//Save Changes but don't discard yet
    context2
.SaveChanges(false);

   
//if we get here things are looking good.
    scope
.Complete();
    context1
.AcceptAllChanges();
    context2
.AcceptAllChanges();

}
我們用SaveChanges(false)先將必要的資料庫操作命令傳送給資料庫,這是注意context1與context2並沒有真正發生改變,如果事務終止,自動回滾,兩者的更改都沒有真正提交到資料庫,所以是可以成功回滾的。

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25897606/viewspace-762663/,如需轉載,請註明出處,否則將追究法律責任。

相關文章