TransactionScope超时过早发生
本文关键字:超时 TransactionScope | 更新日期: 2023-09-27 17:57:56
我正在使用TransactionScope
进行一些批量插入和更新。问题是,即使我将TransactionScope
的超时设置为一小时,我在30分钟长的操作中也会出现超时异常。
此外,在异常之后,它会插入批次中看似随机数量的记录。例如,上一次操作有12440个插入,超时后有7673个记录插入到表中。
CCD_ 3和CCD_ 4的超时都被设置为CCD_。
我做错了什么?
这是我的代码:
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)
您的交易在10分钟后失败了吗?如果是这样的话,您可能达到了在machine.config中设置的事务管理器最大超时值。如果我没有记错,如果您试图设置一个大于最大值的超时值,那么您的设置将被忽略。尝试增加machine.config中的值,看看这是否有助于解决您的问题。
在随机提交方面,您在连接字符串上设置了Transaction Binding=Explicit Unbind
吗?默认值为Transaction Binding=Implicit Unbind
。来自MSDN:
隐式取消绑定导致连接当事务结束。拆卸后连接上的请求为在自动提交模式下执行。这个System.Transactions.Transaction.Current执行时未检查属性请求,而事务忙碌的交易完成后已结束,其他请求为在自动提交模式下执行。
基本上,当事务超时时,到那时为止的所有插入都将被回滚,但使用同一连接完成的任何其他插入都将在自动提交模式下完成,在该模式下,每个插入语句都将立即提交。这听起来确实与您看到的场景相似(但如果没有看到完整的代码/repro,很难知道)。
我想看看您是否可以使用SqlBulkCopy类。它应该更快,并且可能消除长时间超时的需要。