【发布时间】: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