ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Entity Framework中 批量提交 事务处理

Entity Framework中 批量提交 事务处理

Linux操作系统 作者:王雅曦 时间:2015-08-10 19:21:03 0 删除 编辑

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博客 ” ,链接:https://blog.itpub.net/30403026/viewspace-1767477/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: .NET MVC3 JSONP 跨域
请登录后发表评论 登录
全部评论

注册时间:2015-08-10

  • 博文量
    8
  • 访问量
    5069