Sql server 2008 在TransactionScope事务中提交更改时,DataContext连接关闭或事务意外完成? 代码
当上述代码运行时,它成功地完成了600或700次循环迭代。但是,在10到20分钟后,上面的catch块捕捉到以下错误: {“与当前连接关联的事务已完成,但尚未处理。必须先处理该事务,然后才能使用该连接执行SQL语句。”} tran.Complete调用从未进行过,那么为什么它会说与连接关联的事务已完成 为什么在成功提交数百个更改后,与DataContext关联的连接突然进入关闭状态?(这是我有时遇到的另一个错误)Sql server 2008 在TransactionScope事务中提交更改时,DataContext连接关闭或事务意外完成? 代码,sql-server-2008,exception,transactions,datacontext,transactionscope,Sql Server 2008,Exception,Transactions,Datacontext,Transactionscope,当上述代码运行时,它成功地完成了600或700次循环迭代。但是,在10到20分钟后,上面的catch块捕捉到以下错误: {“与当前连接关联的事务已完成,但尚未处理。必须先处理该事务,然后才能使用该连接执行SQL语句。”} tran.Complete调用从未进行过,那么为什么它会说与连接关联的事务已完成 为什么在成功提交数百个更改后,与DataContext关联的连接突然进入关闭状态?(这是我有时遇到的另一个错误) 在分析SQL Server时,只有大量连续的选择和插入,而在运行时实际上没有其他选
在分析SQL Server时,只有大量连续的选择和插入,而在运行时实际上没有其他选择和插入。探查器捕捉到的最后一件事是突然“审核注销”,我不确定这是问题的原因还是副作用。哇,最大超时时间受machine.config限制: “好的,我们解决了这个问题。显然,.NET4.0框架没有解决这个问题 允许您像我们一样在代码中设置transactionscope超时 在过去完成。我们必须通过添加
这让我想知道,如果这是我正在处理的共享托管环境,在那里我无法访问machine.config文件,会怎么样?实际上没有办法分解事务,因为它涉及到在多个表中创建数据,这些表的关系和标识列的值是自动递增的。多么糟糕的设计决策啊。如果这是为了保护共享主机的服务器,那就毫无意义了,因为这样一个长时间运行的事务将只与我自己的数据库隔离。此外,如果程序指定更长的超时,那么它显然期望事务花费更长的时间,因此应该允许它。这个限制只是一个毫无意义的障碍,它会引起问题。另请参见:哇,最大超时时间受machine.config限制: “好的,我们解决了这个问题。显然,.NET4.0框架没有解决这个问题 允许您像我们一样在代码中设置transactionscope超时 在过去完成。我们必须通过添加
这让我想知道,如果这是我正在处理的共享托管环境,在那里我无法访问machine.config文件,会怎么样?实际上没有办法分解事务,因为它涉及到在多个表中创建数据,这些表的关系和标识列的值是自动递增的。多么糟糕的设计决策啊。如果这是为了保护共享主机的服务器,那就毫无意义了,因为这样一个长时间运行的事务将只与我自己的数据库隔离。此外,如果程序指定更长的超时,那么它显然期望事务花费更长的时间,因此应该允许它。这个限制只是一个毫无意义的障碍,它会引起问题。另请参见:很有趣,我在运行应用程序的一分钟内就注意到了这一点!有趣的是,我在运行应用程序的一分钟内就注意到了这一点!
double timeout_in_hours = 6.0;
MyDataContext db = new MyDataContext();
using (TransactionScope tran = new TransactionScope( TransactionScopeOption.Required, new TransactionOptions(){ IsolationLevel= System.Transactions.IsolationLevel.ReadCommitted, Timeout=TimeSpan.FromHours( timeout_in_hours )}, EnterpriseServicesInteropOption.Automatic ))
{
int total_records_processed = 0;
foreach (DataRow datarow in data.Rows)
{
//Code runs some commands on the DataContext (db),
//possibly reading/writing records and calling db.SubmitChanges
total_records_processed++;
try
{
db.SubmitChanges();
}
catch (Exception err)
{
MessageBox.Show( err.Message );
}
}
tran.Complete();
return total_records_processed;
}