我目前对 transactionscope 超时的理解。
如果事务运行时间超过设置的超时时间,则在调用 transaction.complete() 时会引发异常。因此,如果事务中的处理已经进行了 X 分钟,我们仍然需要等待 X 分钟,之后才会调用 transaction.complete。
在我们的例子中,我们在 web 服务中使用 transactionscope - web 请求的最终用户必须等待 X 分钟才能中止事务并且异常冒泡回来。
但是,HttpWebRequest 的默认超时为 100 秒(根据 msdn)。由于客户端在 100 秒内超时,因此我们在事务范围内的超时时间为一分钟。这确保了数据库的一致性。
我对超时的理解是否正确?
问题:我们希望最大限度地缩短最终用户了解交易结果的时间。为了最大限度地减少延迟,我们决定使用嵌套的事务范围分割代码——每个事务范围的超时时间为 15 秒。如果子事务花费的时间超过 15 秒,我们将中止整个事务。
这里似乎忽略了子事务的超时。仅在调用父事务的超时后才出现异常。在下面的代码中 ChildTransaction() 总是返回 true。最小化延迟的推荐方法是什么?代码显示默认超时时间为 1 分钟,这样代码更清晰
internal bool RootTransaction()
{
using (TransactionScope transaction = new TransactionScope())
{
try
{
bool result = ChildTransaction();
//The result is always true.
if (!result)
return result;
for (int counter = 0;counter <= 10;counter++)
{
//Either sleep OR do some processing
System.Threading.Thread.Sleep(5000);
//
//Dosomeprocess()
}
transaction.Complete();
return true;
}
catch (Exception e)
{
return false;
}
}
}
internal bool ChildTransaction()
{
using (TransactionScope transaction = new TransactionScope())
{
try
{
//Sleep for 70 seconds
System.Threading.Thread.Sleep(70000);
transaction.Complete();
}
catch (Exception e)
{
return false;
}
}
return true;
}