2011-05-28 52 views
7

我使用TransactionScope来执行一些批量插入和更新。问题是,即使将TransactionScope的超时设置为1小时,我也会在30分钟的时间内收到超时异常。TransactionScope超时过早发生?

而且异常后插入的批次的记录看似随意的量。例如,最后一个操作有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) 
+1

一个更大的(也可能更重要的)问题是“为什么几万个INSERTS需要这么长时间?” – 2011-05-28 05:43:29

+0

它可能是一个* Command Timeout *发生(因此是一个* TransactionScope超时*的红鲱鱼)?这可以解释“随机性”,考虑到记录插入的非常缓慢......我看到问题说设置为“MaxValue”,但我怀疑......问题不是它看起来的。 – 2011-05-28 06:14:22

+0

@Mitch:它在一个非常缓慢的连接上完成了一个再见。因此,一小时超时限制:) @pst:插入循环完成。每次迭代设置CommandText并执行。所以这不是等待一个大SQL的结果,我怀疑这是一个命令超时。另外我使用一个非常简单的DAL,只有SqlConnection和SqlCommand,我没有看到任何其他的超时。我很乐意检查你能提出的其他建议吗? – dstr 2011-05-28 10:04:40

回答

8

是您的交易10分钟后失败?如果是这样,那么您可能正在访问在machine.config中设置的Transaction Manager Maximum Timeout。如果我记得正确,如果你尝试设置一个超过最大值的超时值,那么你的设置将被忽略。尝试增加machine.config中的值,看看是否有助于解决问题。

在随机提交的条款你设置你的连接字符串Transaction Binding=Explicit Unbind?默认值是Transaction Binding=Implicit Unbind。从MSDN

隐拆散导致连接 从当 结束事务分离。分离后,在自动提交模式 进行连接额外 请求。 System.Transactions.Transaction.Current 属性在执行 请求时未检查,而事务处理为 处于活动状态。交易完成后, 结束,其他请求 以自动提交模式执行。

基本上,当事务超时时,所有到该点的插入将被回滚,但是使用相同连接完成的任何其他插入将以自动提交模式完成,其中每个插入语句将立即提交。这听起来类似于你所看到的场景(但是如果没有看到完整的代码/ repro,很难知道)。

2

我会看到,如果你可以利用SqlBulkCopy Class。它应该快得多,并且可以消除长时间超时的需要。