zoukankan      html  css  js  c++  java
  • Entity Framework 的事务

    一个db.SaveChanges()相当于一个事务,多个db.SaveChanges()保证操作完整性则需要使用事务

    在Entity Framework 中使用事务,事务只会对数据库操作进行回滚,不会对内存操作做回滚

    1.一个db.SaveChanges():

    ModelEntity集 db =new ModelEntity集();

    Entity e=new Entity();

    e.属性赋值……;

    db.SaveChanges();

    2.多个db.SaveChanges():

    添加引用:System.Transactions

    using(var scope = new System.Transactions.TransactionScope()){

    各种逻辑属性赋值处理……;

    dbA.SaveChanges();

    dbB.SaveChanges();

    scope.Complete();   //提交事务,如果有问题则自动回滚

    }

    以下转自:http://www.cnblogs.com/hyl8218/archive/2011/10/10/2205576.html

    在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()方法了。

     
  • 相关阅读:
    学校的破网,你别再掉了
    PhotoShop SDK的获取
    我的C++博客开张了
    一个新的嵌入式门户
    试用Bloglines.com
    PhotoShop的插件体系
    VB6 to VB.NET Migration Guide Community Preview #4
    看看Microsoft都买了些什么
    Borland CTO辞职
    PhotoShop插件的开发
  • 原文地址:https://www.cnblogs.com/xuxin-1989/p/4514287.html
Copyright © 2011-2022 走看看