【发布时间】:2011-06-19 07:14:50
【问题描述】:
我在我的代码中使用 TransactionScrope 在 SQL Server 2008 R2 上执行 50 SQL 命令。 这是我的代码示例:
private void DoSomething()
{
bool IsComplete = false;
SqlCommand sqlComm = null;
//6 hours!!!
TimeSpan ts1 = new TimeSpan(6, 0, 0);
try
{
using (TransactionScope t = new TransactionScope(TransactionScopeOption.RequiresNew, ts1))
{
using (SqlConnection sqlConn = new SqlConnection(GetConnectionString()))
{
//open sql connection
sqlConn.Open();
try
{
//create new sqlCommand
sqlComm = new SqlCommand();
for (int i = 1; i <= 2; i++)
{
IsComplete = true;
//This command takes 15 minutes
sqlComm.CommandText = "exec TestSp";
sqlComm.Connection = sqlConn;
sqlComm.CommandType = CommandType.Text;
sqlComm.CommandTimeout = 18000;
//Executing my command
int j = sqlComm.ExecuteNonQuery();
sw.WriteLine("Finsh Executing SQL Command:" + DateTime.Now.ToLongTimeString());
sw.Flush();
}
//End
IsComplete = true;
}
catch (Exception ex)
{
IsComplete = false;
string Message = ex.Message;
}
finally
{
if (sqlComm != null)
sqlComm.Dispose();
if (IsComplete)
t.Complete();
}
}
}
}
catch (Exception ex)
{
string messagee = ex.Message;
//do something
}
finally
{
MessageBox.Show("Finsh");
}
}
当程序花费超过 10 分钟时,我会收到此异常:
与当前连接关联的事务已完成但尚未处理。必须先释放事务,然后才能使用连接执行 SQL 语句。
通过更改 TimeSpam 和更改 SqlCommand.Timout,我厌倦了很多选项,但由于某种原因,我得到了这个异常。该异常发生在第一次执行后需要很长时间。例如,如果我有 100 个存储过程和文本命令,并且所有命令耗时不到 5 分钟,而只有一个命令耗时超过 10 分钟,那么在长命令之后执行下一个命令将导致异常发生。
有人知道原因吗?
感谢您的帮助!
【问题讨论】:
-
6 小时的交易实在是太疯狂了。非常糟糕的巫毒教。交易应该非常简短。我不认为这有帮助。我会重新设计这个...
标签: c# sql stored-procedures ado.net transactionscope