C#学习教程:TransactionScope环境事务中的错误不会回滚事务INSERTCallAMethod2();//INSERTtran.Complete();}方法CallAMethod2();返回受影响的行=-264,因此无法插入,但已提交第一个插入!我想知道如何使用环境事务,如果第二种方法有多个需要内部事务的操作,我应该把这些操作放在内部事务中吗?像这样:DAL_Helper.Begin_Transaction();//------填充newKeysDictioanryaffectedRow=DBUtilities.InsertEntityWithTrans("table2",newKeysDictioanry,DAL_Helper);如果(affectedRow==1){如果(!string.IsNullOrEmpty(sp_confirm)){result_dt=UserTransactionDAL.Run_PostConfirm_SP(sp_PostConfirm,OBJ.ValuesKey,DAL_Helper);如果(result_dt.Rows.Count>0&&result_dt.Rows[0][0].ToString()=="0"){DAL_Helper.current_trans.Commit();如果(DAL_Helper.connectionState==ConnectionState.Open){DAL_Helper.Close_Connection();}return1;//affectedRow;}else{DAL_Helper.current_trans.Rollback();如果(DAL_Helper.connectionState==ConnectionState.Open){DAL_Helper.Close_Connection();}返回-2;}}//etc1)你需要检查tran.Complete();如果tran.Complete();调用如果调用Completed成功,请考虑TransactionScope。来自MSDN当您的应用程序完成了它想在事务中完成的所有工作时,您应该仅调用一次Complete方法,以通知事务管理器提交事务是可以接受的。未能调用此方法将中止事务。调用tran.Complete();tran.完成();是通知事务管理器完成事务。实际上,事务管理器不会跟踪您的Db适配器,也不知道连接中的操作是成功还是失败。您的应用程序必须通过调用Complete告诉它TransactionScope如何回滚事务?要使您的交易失败,只需确保您不调用tran.Complete();在您的代码中:如果事务范围内没有发生异常(即在TransactionScope对象的初始化和调用其Dispose方法之间),则允许范围参与的事务。如果事务范围内确实发生了异常,则其参与的事务将被回滚。在你的情况下,也许你可以抛出exceptionCallAMethod2();在你的CallAMethod2()中;如果您认为操作失败,则tran.Complete();不被调用,事务将被回滚。2)您可以检查的第二件事是您的连接是否在事务中登记。如果未征用连接,则不会回滚TransactionScope。可能的问题是:在这些情况下,您可以尝试手动登记您的连接(从上面的链接中提取):connection.EnlistTransaction(Transaction.Current)关于您的第二个问题:如果第二种方法有多个需要内部事务的操作,如果我把这些操作放在一个内部事务中怎么办?我会说这真的取决于你是否正在考虑你的CallAMethod2();作为自动操作,这意味着您可以在其他地方直接调用它,而无需将其包装在事务中。大多数时候创建内部事务是有意义的,因为事务可以嵌套。在您的情况下,建议您使用TransactionScopeCallAMethod2();在CallAMethod2()中;,我们在创建新的事务作用域时有一些选择:TransactionScope类提供了几个重载的构造函数,它们接受TransactionScopeOption类型的枚举,它定义了作用域的事务行为。一个TransactionScope对象有三个选项:加入环境事务,或者如果事务不存在则创建一个新事务。成为新的根作用域,即启动一个新事务并使该事务成为其自身作用域内的新环境事务。完全不参与交易。结果是没有环境事务。选择哪一个取决于您的应用程序。就您而言,我想您可以选择第一个选项。以下是MSDN的示例voidRootMethod(){using(TransactionScopescope=newTransactionScope()){/*在这里执行事务工作*/SomeMethod();范围.完成();}}voidSomeMethod(){using(TransactionScopescope=newTransactionScope()){/*在这里执行事务工作*/scope.Complete();您可以使用范围内和外部进行交易:stringconnectionString=ConfigurationManager.ConnectionStrings["db"].ConnectionString;varoption=newTransactionOptions{IsolationLevel=IsolationLevel.ReadCommitted,Timeout=TimeSpan.FromSeconds(60)};使用(varscopeOuter=newTransactionScope(TransactionScopeOption.Required,选项)){使用(varconn=newSqlConnection(connectionString)){使用(SqlCommandcmd=conn.CreateCommand()){cmd.CommandText=“插入数据(代码,FirstName)VALUES('A-100','A先生')";cmd.Connection.Open();cmd.ExecuteNonQuery();}}使用(varscopeInner=newTransactionScope(TransactionScopeOption.Required,选项)){使用(varconn=newSqlConnection(connectionString)){使用(SqlCommandcmd=conn.CreateCommand()){cmd.CommandText="INSERTINTOData(Code,FirstName)VALUES('B-100','Mr.B')";命令。连接.打开();cmd.ExecuteNonQuery();}}scopeInner.Complete();}scopeOuter.Complete();阅读KhanhTO所说的如果在外部事务范围之外打开连接,则不会征募连接。这就是为什么第二次调用失败时第一次调用没有回滚的原因。你必须注册你的连接:以上是C#学习教程:TransactionScope环境事务中的错误,不会回滚事务的全部内容。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——using(TransactionScopetran=newTransactionScope(TransactionScopeOption.Required)){CallAMethod1();//INSERTCallAMethod2();//INSERTtran.Complete();代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
