我目前对 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;
    }