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

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

    To use TransactionScope class you need to keep two things in mind

    1. You need to add System.Transactions reference to your project
    2. Make sure the Windows service “Distributed Transaction Coordinator” is up and running.
  • 相关阅读:
    KVM镜像管理利器-guestfish使用详解
    两台linux机器时间同步
    git配合tortoiseGit的基础使用
    使用yum来下载RPM包而不进行安装
    Linux解压缩总结
    Linux下使用git命令及github项目
    linux shell常用快捷键
    调用 sphinx-build生成HTML文件
    复制virtualenv环境到其他服务器环境配置的方法
    CentOS 6.5 PYPI本地源制作
  • 原文地址:https://www.cnblogs.com/hyl8218/p/2205576.html
Copyright © 2011-2022 走看看