我正在使用TransactionScope
进行一些批量插入和更新。问题是,即使我将TransactionScope
的超时设置为一小时,我也会在30分钟的长时间操作中遇到超时异常。
同样在异常之后,它会插入看似随机数量的批次记录。例如,最后一个操作有12440个插入,超时后,表中插入了7673个记录。
SqlConnection
和SqlCommand
的超时时间都设置为int.MaxValue
。
我做错了什么?
这是我的代码:
using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromHours(1)))
{
try
{
using (db = new DB())
{
//operations here
}
}
catch (Exception ex)
{
throw new Exception("DB Error:\r\n\r\n" + ex.Message);
}
transaction.Complete();
} // <--- Exception here: Transaction aborted (Inner exception: Timeout)
答案 0 :(得分:8)
10分钟后你的交易失败了吗?如果是这样,您可能正在点击machine.config中设置的Transaction Manager Maximum Timeout。如果我没记错,如果您尝试将超时设置为大于最大值,那么您的设置将被忽略。尝试增加machine.config中的值,看看这是否有助于解决问题。
就随机提交而言,您是否在连接字符串上设置了Transaction Binding=Explicit Unbind
?默认值为Transaction Binding=Implicit Unbind
。来自MSDN:
隐式取消绑定会导致连接 在它交易时脱离交易 结束。分离后,另外 关于连接的请求是 在自动提交模式下执行。该 System.Transactions.Transaction.Current 执行时不检查属性 交易时的请求 活性。交易完成后 结束了,额外的请求是 在自动提交模式下执行。
基本上,当事务超时时,将回滚到该点的所有插入,但是使用相同连接完成的任何其他插入将在自动提交模式下完成,其中每个insert语句将立即提交。这听起来与你看到的场景类似(但是如果没有看到完整的代码/ repro,很难知道。)
答案 1 :(得分:2)
我会看看你是否可以使用SqlBulkCopy Class。它应该快得多,并且可以消除长时间超时的需要。