[英]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.