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并没有真正发生改变,如果事务终止,自动回滚,两者的更改都没有真正提交到数据库,所以是可以成功回滚的。
    用发现的眼光来看这个互联网,总有我们立脚的地方!——北纬28.33
  • 相关阅读:
    实验 1:Mininet 源码安装和可视化拓扑工具
    Linux bond 网卡主备模式配置
    git常用命令总结
    框架搭建之--配置去除用户输入两边的空格
    性能优化之--数据库缓存
    性能优化之缓存--文件缓存
    网站优化之缓存--页面缓存
    网站优化之缓存--session和cache以及常用缓存应用之间的区别
    MVC请求管道详细总结梳理。
    sql优化记录
  • 原文地址:https://www.cnblogs.com/aisini/p/1994487.html
Copyright © 2011-2022 走看看