Sql server 2008 在TransactionScope事务中提交更改时,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时,只有大量连续的选择和插入,而在运行时实际上没有其他选

当上述代码运行时,它成功地完成了600或700次循环迭代。但是,在10到20分钟后,上面的catch块捕捉到以下错误:

{“与当前连接关联的事务已完成,但尚未处理。必须先处理该事务,然后才能使用该连接执行SQL语句。”}

tran.Complete调用从未进行过,那么为什么它会说与连接关联的事务已完成

为什么在成功提交数百个更改后,与DataContext关联的连接突然进入关闭状态?(这是我有时遇到的另一个错误)


在分析SQL Server时,只有大量连续的选择和插入,而在运行时实际上没有其他选择和插入。探查器捕捉到的最后一件事是突然“审核注销”,我不确定这是问题的原因还是副作用。

哇,最大超时时间受machine.config限制:

“好的,我们解决了这个问题。显然,.NET4.0框架没有解决这个问题 允许您像我们一样在代码中设置transactionscope超时 在过去完成。我们必须通过添加


到machine.config文件。使用我们没有的2.0框架 将这些条目作为我们的代码覆盖默认值为 首先。”

您在TransactionScope的构造函数中设置的超时似乎被machine.config文件中的最大超时设置忽略或取消。对于接受超时参数的TransactionScope构造函数,文档中没有提到这一点:


这让我想知道,如果这是我正在处理的共享托管环境,在那里我无法访问machine.config文件,会怎么样?实际上没有办法分解事务,因为它涉及到在多个表中创建数据,这些表的关系和标识列的值是自动递增的。多么糟糕的设计决策啊。如果这是为了保护共享主机的服务器,那就毫无意义了,因为这样一个长时间运行的事务将只与我自己的数据库隔离。此外,如果程序指定更长的超时,那么它显然期望事务花费更长的时间,因此应该允许它。这个限制只是一个毫无意义的障碍,它会引起问题。另请参见:

哇,最大超时时间受machine.config限制:

“好的,我们解决了这个问题。显然,.NET4.0框架没有解决这个问题 允许您像我们一样在代码中设置transactionscope超时 在过去完成。我们必须通过添加


到machine.config文件。使用我们没有的2.0框架 将这些条目作为我们的代码覆盖默认值为 首先。”

您在TransactionScope的构造函数中设置的超时似乎被machine.config文件中的最大超时设置忽略或取消。对于接受超时参数的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;
}