分享

Entity Framework中的批量提交与分布式事务处理

 蜗牛之窝 2012-06-10

在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并没有真正发生改变,如果事务终止,自动回滚,两者的更改都没有真正提交到数据库,所以是可以成功回滚的。

 

 

用发现的眼光来看这个互联网,总有我们立脚的地方!——北纬28.33
1
1
(请您对文章做出评价)
 博主前一篇:利用VS自带的命令行工具查看和生产PublicKeyToken
 博主后一篇:ADO.NET 从DataTable中获取某列含有的不同值的几种方式
posted @ 2011-03-25 00:35 北纬28.33 阅读(3348) 评论(10编辑 收藏

  
#1楼 2011-03-25 03:51 | jacob Lai  
不错。顶。。。
  
#2楼 2011-03-25 08:54 | 周行天下  
貌似EF的操作本身就是事务性的。。。
  
#3楼 2011-03-25 10:28 | 我是你的猪  
没看懂. 同2L,context本来就是事务性的.

为什么会有2个不同的context.
  
#5楼[楼主2011-03-25 13:07 | 北纬28.33  
@我是你的猪
没错,EF本身的操作是具有事务机制的,但是示例中有两个不同Context,他们属于分布式操作,已经脱离了EF的事务处理,所以这个时候TransactionScope就起到作用了
  
#6楼[楼主2011-03-25 13:08 | 北纬28.33  
@要有好的心情
Good!
  
#7楼 2011-03-25 17:37 | 我是你的猪  
分布式操作是指? 只要在一个解决方案里,都能合并懂到一个context上啊.
  
#8楼[楼主2011-03-25 17:49 | 北纬28.33  
@我是你的猪
TransactionScope可以对多次数据库连接保持事务一致性
.NET中常用的事务有Transaction,TransactionScope ,MSTDC...
  
#9楼[楼主2011-03-25 17:51 | 北纬28.33  
  
#10楼 2011-03-26 20:03 | 我是你的猪  
@北纬28.33
原来如此.感谢分享.
不过最近发生了件杯具的事情也是事务问题.
就像您说的我有2个insert动作,是事务性的.(C/S)
结果客户那边网络相当不稳定,在insert第一个之后很有可能就会断网,结果也就没回滚,让我相当郁闷.
清理数据搞起来也很麻烦.正在考虑是不是只有全部放到存储过程里面去才行.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多