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)

TransactionScope超时过早发生

您的交易在10分钟后失败了吗?如果是这样的话,您可能达到了在machine.config中设置的事务管理器最大超时值。如果我没有记错,如果您试图设置一个大于最大值的超时值,那么您的设置将被忽略。尝试增加machine.config中的值,看看这是否有助于解决您的问题。

在随机提交方面,您在连接字符串上设置了Transaction Binding=Explicit Unbind吗?默认值为Transaction Binding=Implicit Unbind。来自MSDN:

隐式取消绑定导致连接当事务结束。拆卸后连接上的请求为在自动提交模式下执行。这个System.Transactions.Transaction.Current执行时未检查属性请求,而事务忙碌的交易完成后已结束,其他请求为在自动提交模式下执行。

基本上,当事务超时时,到那时为止的所有插入都将被回滚,但使用同一连接完成的任何其他插入都将在自动提交模式下完成,在该模式下,每个插入语句都将立即提交。这听起来确实与您看到的场景相似(但如果没有看到完整的代码/repro,很难知道)。

我想看看您是否可以使用SqlBulkCopy类。它应该更快,并且可能消除长时间超时的需要。