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.
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
移到街区scope.Complete();外面connection.
using (var scope = new TransactionScope())
{
using (var connection = (SqlConnection)customerTable.OpenConnection())
{
//
}
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)