错误 – 与当前连接关联的交易已经完成,但尚未处理
我一直在使用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(); }