【问题标题】:TransactionScope Timeout overridenTransactionScope 超时被覆盖
【发布时间】:2013-12-04 01:57:03
【问题描述】:

我已经为此挖遍了所有地方,我不太明白我所看到的。 这不是我写的代码,所以我试图了解发生了什么。 裸露的骨头在这里:

(action() 是传入的 Action 对象。基本上是这样的 () => sp.BalanceAccounts(dto)

     try
     {

       TransactionOptions transactionOptions = new TransactionOptions();
       transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted;
       transactionOptions.Timeout = new TimeSpan(0, 0, 1); //added as a test
       sw.Start(); //this is a timer I added to check timeout
       using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
           {
             action();

             scope.Complete();                    
           }
           sw.Stop();
      }
catch (Exception ex)
      {
          sw.Stop();
          Do some stuff
      }

问题在于,当传入的操作涉及 sqlDataAdapter 时,超时时间似乎是 SelectCommand.CommandTimeout 的超时时间,而不是 TransactionScope 设置的超时时间。 我添加了显式超时设置来尝试查看发生了什么。

在我有限的理解中,我认为超时时间是针对 TransactionScope 的,如果超过这个时间,它会下降到 catch 块。

如果我通过使用 sqlDataAdapter 运行一个已知的长时间运行的查询,并将 CommandTimeout 设置为 18 秒(这很明显),那么上面 catch 块中的秒表显示刚刚超过 18 秒。如果我运行其他操作作为有点慢的操作,不使用 sqlDataAdapter,那么 catch 块中的计时器显示刚刚超过 1 秒(这是我设置为事务范围超时的时间)。 是否只是事务在 1 秒处超时,但在 sqlDataAdapter 也超时之前它无法进入 catch 块? 我在 sqlDataAdapter 中修复了长时间运行的查询,因此它不再超时,但留下了这个稍微大一点的图片难题。

提前感谢任何提示!

【问题讨论】:

  • “超时时间似乎是 SelectCommand.CommandTimeout 的超时时间,而不是 TransactionScope 的超时时间” - 这是正确的,它是如何设计的。
  • 我自己刚刚得出这个结论,正要发帖。感谢那。有时我看不到树木的树木!所以,调用堆栈中的最后一个设置超时?

标签: .net sql-server c#-4.0


【解决方案1】:

有两个单独的超时。一个是查询的,一个是整个事务的。

假设您的查询超时时间为两分钟,事务超时时间为一分钟。如果查询在 30 秒内运行,您就可以了。如果它在 90 秒内运行,那你就不行了:它在查询超时之内,但事务会超时(下面会出现有用的错误)。

与当前连接关联的事务已完成 但尚未处置。交易必须在 连接可用于执行 SQL 语句。

(这种情况经常发生,因为默认值实际上是一分钟,我相信)。

现在假设您在一笔交易中有三个查询。每个查询的超时时间为一分钟,事务的超时时间为三分钟。如果每个查询在 45 秒内运行,那没问题:每个查询在其超时内完成,整个事务需要 2 分 15 秒,这在三分钟超时内。

但是,如果查询 1 需要 30 秒,查询 2 需要 45 秒,查询 3 需要 90 秒,那么您又遇到了麻烦,因为查询 3 超过了它的一分钟超时。请注意,事务超时没有发挥作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    相关资源
    最近更新 更多