如何处理 ASP.NET 数据库事务超时



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

问题是使用 SQL Server 探查器跟踪到"调用 Web 服务的函数"。

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

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

at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection(at 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();
}

如果为"确定",则释放器自动执行提交。

您也可以通过代码直接处理。 请参阅以下代码

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;

最新更新