繁体   English   中英

如何处理 ASP.NET dbtransaction 超时

[英]how to handle ASP.NET dbtransaction timeout

几天来,我一直在 ASP.NET 2.0 和 SQL Server 2008 应用程序中遇到数据库事务超时。

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

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

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

在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,Boolean 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>

类似的东西

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 会自动执行提交。

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

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;
}

吹线将执行时间更改为无穷大或直到查询执行完成。

cmd.CommandTimeout = 0;

暂无
暂无

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

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