美文网首页
Entity Framework中的批量提交与事务处理

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

作者: Asa_Guo | 来源:发表于2017-04-19 09:43 被阅读0次

    TransactionScope是.Net Framework 2.0滞后,新增了一个名称空间。它的用途是为数据库访问提供了一个“轻量级”[区别于:SqlTransaction]的事物。使用之前必须添加对 System.Transactions.dll 的引用。
    在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并没有真正发生改变,如果事务终止,自动回滚,两者的更改都没有真正提交到数据库,所以是可以成功回滚的。

    相关文章

      网友评论

          本文标题:Entity Framework中的批量提交与事务处理

          本文链接:https://www.haomeiwen.com/subject/svjxuttx.html