【问题标题】:how to handle ASP.NET dbtransaction timeout如何处理 ASP.NET dbtransaction 超时
【发布时间】:2020-02-13 10:46:38
【问题描述】:

我已经在 ASP.NET 2.0 和 SQL Server 2008 应用程序中遇到数据库事务超时数天了。

问题在于使用 SQL Server 分析器跟踪“调用 Web 服务的函数”。

我们的事务包括几个存储过程(sp)。但是存储过程#3 有一些字节要保存在数据库中,它会消耗时间。当时间超过 25 秒时,它会抛出一个超时异常消息:

消息:System.Web.Services.Protocols.SoapException:服务器无法处理请求。 ---> System.Data.SqlClient.SqlException:超时已过期。在操作完成之前超时时间已过或服务器没有响应。

在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔型 breakConnection)
在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)

我的代码:

using (System.Data.Common.DbConnection connection = o_DB.CreateConnection())
{
     connection.Open();

     System.Data.Common.DbTransaction o_Transaction = connection.BeginTransaction();

     try
     {
        - exec sp1
        - exec sp2
        foreach{
            - exec sp3
        }
     }

我们在网络上尝试了一些解决方案,但没有奏效。我希望有人能帮帮我。 非常感谢。

web.config 的连接字符串中没有timeout,它不会在 15 秒后出现异常(默认)

我们在web.config中设置了事务超时:

<system.transactions>
    <machineSettings maxTimeout="00:00:30" />
</system.transactions>

【问题讨论】:

    标签: c# sql-server-2008-r2 ado.net asp.net-2.0 connection-timeout


    【解决方案1】:

    类似的东西

    using (var ts = CreateTransactionScope(TimeSpan.FromSeconds(mySecondsVar)))
    { 
        using (System.Data.Common.DbConnection connection = o_DB.CreateConnection())
        {
            using (IDbTransaction tran = connection.BeginTransaction()) {
            try 
            {
                // your code
            }  
            catch {
                tran.Rollback();
            }
        }
    }
        ts.Complete();
    }
    

    如果是“ok”,dispose 会自动提交。

    【讨论】:

      【解决方案2】:

      您也可以直接通过代码处理。 请看下面的代码

      public DataSet getData(string command)
      {
          DataSet ds = new DataSet();
          string connectionString = ConfigurationManager.ConnectionStrings["TESTDB"].ConnectionString;
          using (var conn = new SqlConnection(connectionString))
          {
              using (var cmd = new SqlCommand(command, conn))
              {
                  cmd.CommandType = CommandType.StoredProcedure;
                  cmd.CommandTimeout = 0;
                  SqlDataAdapter adapt = new SqlDataAdapter(cmd);
                  conn.Open();
                  adapt.Fill(ds);
                  conn.Close();
              }
          }
          return ds;
      }
      

      blow line 会将执行时间更改为无穷大或直到查询执行完成。

      cmd.CommandTimeout = 0;
      

      【讨论】:

      • 在生产环境中设置无限时间是不可取的。我们可以设置事务超时其他connectionTimeout吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      • 2016-03-27
      • 2015-01-03
      相关资源
      最近更新 更多