.net TransactionScope超时被覆盖

.net TransactionScope超时被覆盖,.net,sql-server,c#-4.0,.net,Sql Server,C# 4.0,为了这个,我到处找,我不太明白我看到了什么。 这不是我写的代码,所以我试图理解发生了什么。 这里是赤裸裸的骨骼: (action()是传入的一个action对象。基本上是这样的()=>sp.BalanceAccounts(dto) 问题是,当传入的操作涉及sqlDataAdapter时,超时时间似乎是SelectCommand.CommandTimeout的超时时间,而不是TransactionScope设置的超时时间。 我添加了显式超时设置,以尝试查看发生了什么 在我有限的理解中,我认为超时时

为了这个,我到处找,我不太明白我看到了什么。 这不是我写的代码,所以我试图理解发生了什么。 这里是赤裸裸的骨骼:

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


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

在我有限的理解中,我认为超时时间应该是TransactionScope的,如果超过这个时间,它将下降到catch块

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


有两个单独的超时,一个用于查询,另一个用于整个事务

假设查询超时时间为两分钟,事务超时时间为一分钟。如果查询在30秒内运行,则无所谓。如果查询在90秒内运行,则无所谓:它在查询超时时间内,但事务将超时(下面有一个有用的错误)

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

(这种情况经常发生,因为我认为违约时间实际上是一分钟)

现在,假设您在一个事务中有三个查询。每个查询有一分钟的超时,而事务有三分钟的超时。如果每个查询在45秒内运行,您就没事了:每个查询在其超时内完成,整个事务需要2分钟15秒,这在三分钟的超时内


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

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

假设查询超时时间为两分钟,事务超时时间为一分钟。如果查询在30秒内运行,则无所谓。如果查询在90秒内运行,则无所谓:它在查询超时时间内,但事务将超时(下面有一个有用的错误)

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

(这种情况经常发生,因为我认为违约时间实际上是一分钟)

现在,假设您在一个事务中有三个查询。每个查询有一分钟的超时,而事务有三分钟的超时。如果每个查询在45秒内运行,您就没事了:每个查询在其超时内完成,整个事务需要2分钟15秒,这在三分钟的超时内


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

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