了解的TransactionScope超时(Understanding transactionsco

2019-09-16 09:54发布

我目前的TransactionScope超时的理解。

如果交易已经超过设定的超时时间跑步的时间延长,它抛出时transaction.complete()被调用的异常。 因此,如果事务中的处理已经持续X分钟,我们仍然将不得不等待X分钟之后,transaction.complete被调用。

在我们的例子中,我们使用的TransactionScope从Web服务中 - web请求的最终用户将不得不等待X分钟前的交易中止和异常冒泡了。

然而,对于一个HttpWebRequest的默认超时为100秒(根据MSDN)。 由于客户端超时100秒我们都在一分钟的TransactionScope超时。 这可确保数据库的一致性。

我超时的理解是否正确?

问:我们想尽量缩短最终用户的时间去了解交易的结果。 为了尽量减少等待时间,我们决定分手使用嵌套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;
    }

Answer 1:

尝试看看它是这样的:

当你调用trans.Complete()或退出交易范围交易的长度来确定。 看看下面的代码:

using (var trans= new TransactionScope())
{
Threading.Sleep(99999);
trans.Complete()
}

有没有办法抛出,而睡眠习惯内超时异常,它是没有意义的,如果它没有。 因此使用事务超时(这样至少)只能保证如果交易不是您超时需要更长的时间,它不会被COMMITED。

如果你只是执行一个查询(我wouln't知道你用什么来进行交易),那么你可以设置查询/命令超时(或者无论你怎么称呼它)。 IIRC,超时到期后您的查询将立即返回。

另一种方法是设置Web服务请求超时,只是假设web服务时间太长,因为无论是你的事务中的响应。

编辑:您可以尝试:

  • 在不同的线程产卵的事务,然后等待它完成(使用的Thread.join(超时))在你的主线程(一个由Web服务调用中使用)。 所以,如果不指定超时之前终止,那么你可以停止等待,并返回超时错误(不要忘记信号另一个线程中止交易)。
  • 假设你只有那些交易中执行SQL查询,您可以使用“BEGIN TRANSACTION”关键字(确实哈克)指定SQL脚本交易。 然后,你可以只指定命令超时和执行这一切都在一个单一的代码行。 但随后这需要你移动你的事务中尽到一个SQL脚本,它可能会或可能不适合你可以...这是不干净。


文章来源: Understanding transactionscope timeouts