繁体   English   中英

为什么我在使用 TransactionScope 时出错?

[英]Why Am I Getting Error Using TransactionScope?

大家!

我在使用 TransactionScope 时遇到问题。 我希望我的网络方法是事务性的。 如果发生任何异常,我希望所有数据库更改回滚。 否则,提交。 请参阅下面的错误消息。

System.ApplicationException: 错误在 someClass :: Method public returnType methodName(parameterType parameter) :

System.ApplicationException:someClass 中的错误 :: 方法私有字符串 someMethod() :

System.Data.Odbc.OdbcException (0x80131937):

错误 [08003] [Sybase][ODBC 驱动程序]连接未打开

在 System.Data.Odbc.OdbcConnection.Open_EnlistTransaction(事务事务)

在 System.Data.Odbc.OdbcConnectionOpen.EnlistTransaction(事务事务)

在 System.Data.Odbc.OdbcConnection.EnlistTransaction(事务事务)

在 System.Data.Odbc.OdbcConnection.Open()

在 c:\\somePath\\someClass.cs:line 35 中的 someNameSpace.someMethod()

以下是我的代码的摘录。 我究竟做错了什么?

 [WebMethod]
 public returnType methodName(parameterType parameter)
 {
     using (var transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew))
     {
         try
         {
             var someValue = someMethod();
                 :
                 :
                 :

             transactionScope.Complete();

             return response;
         }
         catch (Exception ex)
         {
             return ErrorMessages(ex);
         }
     }
 }

 private string someMethod()
 {
     var commandText = "...some valid SQL expression...";
     var commandType = CommandType.Text;

     try
     {
         using (var odbcConnection = new OdbcConnection(DefaultDbConnection.ToString()))
         {
             using (var odbcCommand = new OdbcCommand(commandText, odbcConnection))
             {
                 odbcConnection.Open();  // Exception is thrown here!
                 odbcCommand.CommandType = commandType;

                 using (var reader = odbcCommand.ExecuteReader())
                 {
                     reader.Read();
                     return reader.GetString(0);
                 }
             }
         }
     }
     catch (Exception ex)
     {
         throw new ApplicationException("Error in someMethod.", ex);
     }
 }

预先感谢您的帮助!

最终,并不是所有的连接类型——也不是所有的平台——都支持基于事务范围的事务,即使它们支持:当与多个系统交谈时,由于范围问题,它们可能是不可预测的,需要像 DTC 这样的东西。

相反,我强烈建议简单地:不要使用事务范围(除非你有很好的理由)。 相反,更喜欢更简单和更广泛支持的 ADO.NET 事务模型:

  • 在连接上使用BeginTransaction (或异步等效项)以(不出所料)开始事务
  • 在代码中携带该交易实例
  • 在每个命令上设置事务属性(我一直不明白为什么这是必要的,因为它是通过连接隐含的,但是:它是)
  • 确保在最后提交或中止事务,理想情况下使用try / catch / finally以便它在成功和失败时正确发生

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM