使用EF6你有新的事务处理可以使用类似于:

复制代码
  1. using (var context = new PostEntityContainer())
  2. {
  3. using (var dbcxtransaction = context.Database.BeginTransaction())
  4. {
  5. try
  6. {
  7. PostInformation NewPost = new PostInformation()
  8. {
  9. PostId = 101,
  10. Content = "This is my first Post related to Entity Model",
  11. Title = "Transaction in EF 6 beta"
  12. };
  13. context.Post_Details.Add(NewPost);
  14. context.SaveChanges();
  15. PostAdditionalInformation PostInformation = new PostAdditionalInformation()
  16. {
  17. PostId = (101),
  18. PostName = "Working With Transaction in Entity Model 6 Beta Version"
  19. };
  20. context.PostAddtional_Details.Add(PostInformation);
  21. context.SaveChanges();
  22. dbcxtransaction.Commit();
  23. }
  24. catch
  25. {
  26. dbcxtransaction.Rollback();
  27. }
  28. }
  29. }

实际上是rollback时所需地下行动? 我好奇只因Commit描述说, " 提交基础存储交易"

而Rollback描述说: " 回滚基础存储区交易"

这让我好奇,因为在我看来,如果不调用Commit,以前执行的命令不会存储( 对我这没什么奇怪) 。 但是如果是这样,原因是调用Rollback函数怎么做? EF5中我用TransactionScope哪些没有Rollback函数( 只有Complete ),它看起来很合理。 因为MS DTC原因我无法使用TransactionScope了,可我也不能使用try catch,如上面的例子( 我如果不包含了,我只用Commit ) 。

时间:17年06月07日原作者:Areius 共9个回答

 
0 0
 
 

你不需要调用 Rollback手动,因为你使用的是 using语句。

DbContextTransaction.Dispose将被调用的方法的末尾。 using块中。 然后它会自动回滚事务,只要事务未成功执行( 而不是调用,或者遇到了异常) 。 下面是页面的源代码, SqlInternalTransaction.Dispose方法( DbContextTransaction.Dispose将最终委托给它使用SQLServer提供者时) :

复制代码
  1. private void Dispose(bool disposing)
  2. {
  3. // ...
  4. if (disposing && this._innerConnection != null)
  5. {
  6. this._disposing = true;
  7. this.Rollback();
  8. }
  9. }

你看字母,则程序检查 _innerConnection( 如果不为null,如果不是,回滚该事务提交, _innerConnection将为null ) 。 让我们看看 Commit是什么:

复制代码
  1. internal void Commit()
  2. {
  3. // Ignore many details here...
  4. this._innerConnection.ExecuteTransaction(...);
  5. if (!this.IsZombied && !this._innerConnection.IsYukonOrNewer)
  6. {
  7. // Zombie() method will set _innerConnection to null
  8. this.Zombie();
  9. }
  10. else
  11. {
  12. this.ZombieParent();
  13. }
  14. // Ignore many details here...
  15. }
  16. internal void Zombie()
  17. {
  18. this.ZombieParent();
  19. SqlInternalConnection innerConnection = this._innerConnection;
  20. // Set the _innerConnection to null
  21. this._innerConnection = null;
  22. if (innerConnection != null)
  23. {
  24. innerConnection.DisconnectTransaction(this);
  25. }
  26. }

原作者:Mouhong Lin

 
0 0
 
 

只要你永远都是使用SQL Server EF的,不需要显式使用catch来调用Rollback方法。 using块允许自动回滚到任何异常永远是可行的。

但是,如果你仔细想想的话从Entity Framework角度看,你能够理解为什么所有示例使用显式调用Rollback交易 在EF,是虚构的,可插入的数据库提供程序和提供程序都可以替换成MySQL或任何其他具有EF的数据库提供程序的实现。 因此,从EF角度看,不保证提供程序将自动回滚事务,因为disposed EF不知道有关的实现数据库提供程序。

所以,作为最佳实践,EF文档建议你显式Rollback你万一有一天提供程序更改为一个实现,该实现不自动rollback对dispose 。

在我看来,写得精彩和dispose中提供程序将自动回滚事务,因此其他的努力都包装在using块内使用try catch回滚是overkill 。

原作者:rwb

 
0 0
 
 
  1. 既然你写了'使用'块实例化事务,则不必提到Rollback函数明确后它会自动回滚( 除非它已提交) 时的处置。
  2. 但是如果你实例化时可以不使用using块,在这种情况下,有必要回滚事务在异常情况下( 正是在catch块中),并且也与Null检查对于更加可靠的代码。 BeginTransaction的工作与事务范围( 不同,后者只需要一个完整的函数如果所有操作被成功完成) 。 而是像是到工作Sql的事务处理。

原作者:Paali

 
0 0
 
 
复制代码
  1. //For Insert/Update/Delete
  2. public void ExecuteNonQuery(DbCommand comm)
  3. {
  4. if (comm == null || string.IsNullOrEmpty(comm.CommandText))
  5. {
  6. return;
  7. }
  8. else
  9. {
  10. if (_database == null)
  11. {
  12. _database = DatabaseFactory.CreateDatabase();
  13. }
  14. //create a db connection
  15. using (DbConnection conn = _database.CreateConnection())
  16. {
  17. //open connection and begin transaction
  18. conn.Open();
  19. comm.Connection = conn;
  20. //DbTransaction trans = conn.BeginTransaction();
  21. DbTransaction trans = comm.Connection.BeginTransaction();
  22. //perform query operation
  23. try
  24. {
  25. comm.ExecuteNonQuery();
  26. //_database.ExecuteNonQuery(comm);
  27. //commit changes
  28. trans.Commit();
  29. }
  30. catch (Exception ex)
  31. {
  32. //rollback changes if error occurs
  33. //LogHelper.WriteEntryToEventLog(ex, comm);
  34. trans.Rollback();
  35. throw ex;
  36. }
  37. finally
  38. {
  39. //close and dispose connnection and transaction objects
  40. trans.Dispose();
  41. conn.Close();
  42. conn.Dispose();
  43. }
  44. }
  45. return;
  46. }
  47. }

总之,就像可成时发生错误回滚sql命令。 它不会执行该命令,使该行throw ex,不会进行调用,而是将仅重置。

原文:https://ask.helplib.com/c-Sharp/post_1073745

Entity Framework 6事务回滚的更多相关文章

  1. Entity Framework实现事务回滚

    在使用Entity Framework为主从表添加数据,当一个表添加数据成功,另一个表添加数据失败,这时候就需要用到事务回滚. 比如有以下关系的2张表. 客户端使用TransactionScope类可 ...

  2. Entity Framework的事务提交

    一组业务整体处理的行为叫一个事务.这一组的业务都能成功处理,我们就可以把这个事务提交来保存你已做的行为结果.事物的Commit是执行了你的方法进行了数据库的提交,之前的sava都是放在缓存中并没有执行 ...

  3. Entity Framework 的事务 DbTransaction

    事务代码实现如下: public static void Transaction() { myitEntities entity = null; DbTransaction tran = null; ...

  4. Java进阶知识24 Spring的事务管理(事务回滚)

    1.事务控制概述   1.1.编程式事务控制         自己手动控制事务,就叫做编程式事务控制.         Jdbc代码: connection.setAutoCommit(false); ...

  5. Spring 事务回滚机制详解

    1:事务原理 1.2:aop/动态代理 类路径:org/springframework/aop/framework/CglibAopProxy.java ReflectiveMethodInvocat ...

  6. SQL 事务回滚

    事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服 ...

  7. Spring异常抛出触发事务回滚

    Spring.EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚 /** * 如果在spring事务配置中不为切入点(如这里的切入点可以定义成test*) ...

  8. 【Java EE 学习 19】【使用过滤器实现全站压缩】【使用ThreadLocal模式解决跨DAO事务回滚问题】

    一.使用过滤器实现全站压缩 1.目标:对网站的所有JSP页面进行页面压缩,减少用户流量的使用.但是对图片和视频不进行压缩,因为图片和视频的压缩率很小,而且处理所需要的服务器资源很大. 2.实现原理: ...

  9. SqlServer事务回滚(2)

    SQL Server 2008中SQL应用系列--目录索引 SQL事务 一.事务概念    事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是 ...

随机推荐

  1. day29 进程

    1..操作系统知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的 ...

  2. C语言指针收藏

    指针是什么 >>每一个内存单元只能同时存储一个数据,如何保证内存单元同时只能存储一个数据,可以使用编号的方式实现内存单元标记,此编号就是指针. >>指针是一个变量,指针是存放着 ...

  3. 分布式事务框架-fescar

    https://github.com/alibaba/fescar/wiki/%E6%A6%82%E8%A7%88?spm=5176.11156381.0.0.b9f85ceegUXvCC

  4. 练习五十六:for循环

    某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换 方法一: def o ...

  5. my04_Mysql复制数据一致性校验

    1. 搭建一套双节点的Mysql主从复制数据库 2. 主库初始化测试数据 drop table if exists test; ),test_id int NOT NULL AUTO_INCREMEN ...

  6. 获取tomcat路径

    String serverPath = System.getProperty("catalina.home");

  7. XAMPP: Another web server is already running

    nginx 和 xampp 一起使用的时候,如果 nginx先启动,然后 再启动 xampp的时候,就是修改了 http.conf也是会报如果错误 liaohb@ubuntu-xtn->$sud ...

  8. ubuntu install fonts

    sudo apt-get install ttf-wqy-zenhei

  9. C语言实现通用链表初步(一)

    注意:本文讨论的是无头单向非循环链表. 假设不采用Linux内核链表的思路,怎样用C语言实现通用链表呢? 一种常用的做法是: typedef int element_t; struct node_in ...

  10. android 官网访问不了

    网上搜到的解决方案,亲测有用.记下来,以备遗忘. 使用管理员权限,修改C:\Windows\System32\Drivers\etc\hosts文件,加入以下内容 173.194.127.7 deve ...