错误 – 与当前连接关联的交易已经完成,但尚未处理

我一直在使用TransactionScope将多个数据库查询包装到TransactionScope中遇到问题,我正在使用SqlBulkCopy与批处理大小500.当我将批量增加到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(); } } 

我知道这是迟到了,但也许会帮助别人。

当事务超时时可能发生这种情况。 您可以像这样增加交易的超时时间(使用适合于预期交易时间长度的值)。 下面的代码是15分钟:

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

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

我发现在TransactionScope中设置超时不适用于我。 我还需要将以下configuration项添加到machine.config <configuration>标记的末尾以延伸超过10分钟的默认最大超时时间。

 <system.transactions> <machineSettings maxTimeout="00:30:00" /> <!-- 30 minutes --> </system.transactions> 

信用: http : //thecodesaysitall.blogspot.com.au/2012/04/long-running-systemtransactions.html

移动scope.Complete();connection块之外。

 using (var scope = new TransactionScope()) { using (var connection = (SqlConnection)customerTable.OpenConnection()) { // } scope.Complete(); }