错误 - 与当前连接关联的事务已完成但尚未处理

Pra*_*eep 64 .net c# sql-server-2008 c#-4.0

我一直在使用TransactionScope将多个数据库查询包装到事务中时遇到问题,我正在使用带有batchsize 500的SqlBulkCopy.当我将批量大小增加到1000时,我收到错误:

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

这是我正在使用的代码:

using (var scope = new TransactionScope())
{
    using (var connection = (SqlConnection)customerTable.OpenConnection())
    {
        var table1BulkCopy = new SqlBulkCopy(connection)
        {
            BatchSize = BATCH_SIZE,
            DestinationTableName = TableName1
        };

        table1BulkCopy.WriteToServer(table1DataTable);

        var table2BulkCopy = new SqlBulkCopy(connection)
        {
            BatchSize = BATCH_SIZE,
            DestinationTableName = TableName2
        };

        table2BulkCopy.WriteToServer(table2DataTable);

        var table3BulkCopy = new SqlBulkCopy(connection)
        {
            BatchSize = BATCH_SIZE,
            DestinationTableName = TableName3
        };

        table1BulkCopy.WriteToServer(table3DataTable);

        var table4BulkCopy = new SqlBulkCopy(connection)
        {
            BatchSize = BATCH_SIZE,
            DestinationTableName = TableName4
        };

        table4BulkCopy.WriteToServer(table4DataTable);

        scope.Complete();
    }
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*een 116

当事务超时时,可能会发生这种情况.您可以像这样增加事务的超时(使用适合预期事务长度的值).以下代码为15分钟:

using (TransactionScope scope = 
             new TransactionScope(TransactionScopeOption.Required, 
                                   new System.TimeSpan(0, 15, 0)))
  {
      // working code here
  }
Run Code Online (Sandbox Code Playgroud)

这就是为什么它可以用于batchsize 500而不是1000.

  • 我用`Timeout = TransactionManger.MaximumTimeout` 得到了这个,所以这不是这个错误发生的唯一方式。 (4认同)

Ada*_*dam 21

我发现在TransactionScope中设置超时对我来说不起作用.我还需要将以下配置密钥添加到machine.config <configuration>标记的末尾,以延长超过10分钟的默认最大超时.

<system.transactions>
    <machineSettings maxTimeout="00:30:00" /> <!-- 30 minutes -->
</system.transactions>
Run Code Online (Sandbox Code Playgroud)

图片来源:http: //thecodesaysitall.blogspot.com.au/2012/04/long-running-systemtransactions.html


ada*_*ost 7

移到街区scope.Complete();外面connection.

using (var scope = new TransactionScope())
{
  using (var connection = (SqlConnection)customerTable.OpenConnection())
   {
    //
   }
  scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)