几天来,我一直在 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;