我目前对TransactionScope超时的理解如下:
如果事务运行时间超过设置的超时时间,当调用transaction.complete()方法时会抛出异常。因此,如果事务内的处理已经进行了X分钟,我们仍然需要等待X分钟后才能调用transaction.complete。
在我们的情况下,我们从webservice中使用TransactionScope - Web请求的最终用户将不得不等待X分钟,然后事务将被中止并返回异常。
但是,HttpWebRequest的默认超时时间为100秒(根据msdn)。由于客户端在100秒内超时,因此我们在TransactionScope中有1分钟的超时时间。这可以确保数据库一致性。
我的超时理解正确吗?
问题:我们希望尽量缩短最终用户知道事务结果的时间。为了最小化延迟,我们决定使用嵌套的TransactionScopes分割代码 - 每个事务的超时时间为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;
}