TransactionScope超时是否过早发生?

时间:2011-05-28 05:36:18

标签: c# .net transactions transactionscope

我正在使用TransactionScope进行一些批量插入和更新。问题是,即使我将TransactionScope的超时设置为一小时,我也会在30分钟的长时间操作中遇到超时异常。

同样在异常之后,它会插入看似随机数量的批次记录。例如,最后一个操作有12440个插入,超时后,表中插入了7673个记录。

SqlConnectionSqlCommand的超时时间都设置为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)

2 个答案:

答案 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。它应该快得多,并且可以消除长时间超时的需要。