Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 了解transactionscope超时_C#_Asp.net_Sql Server 2008_Transactionscope - Fatal编程技术网

C# 了解transactionscope超时

C# 了解transactionscope超时,c#,asp.net,sql-server-2008,transactionscope,C#,Asp.net,Sql Server 2008,Transactionscope,我目前对transactionscope超时的理解 如果事务的运行时间超过了设置的超时时间,则在 调用transaction.complete()。因此,如果事务中的处理一直在进行 对于X分钟,我们仍然必须等待X分钟,然后调用transaction.complete 在我们的例子中,我们从web服务中使用transactionscope—web请求的最终用户 在事务中止和异常冒泡返回之前,必须等待X分钟 但是,HttpWebRequest的默认超时为100秒(根据msdn)。自从客户时代以来 1

我目前对transactionscope超时的理解

如果事务的运行时间超过了设置的超时时间,则在 调用transaction.complete()。因此,如果事务中的处理一直在进行 对于X分钟,我们仍然必须等待X分钟,然后调用transaction.complete

在我们的例子中,我们从web服务中使用transactionscope—web请求的最终用户 在事务中止和异常冒泡返回之前,必须等待X分钟

但是,HttpWebRequest的默认超时为100秒(根据msdn)。自从客户时代以来 100秒后,我们在transactionscope中有一分钟的超时。这确保了数据库的一致性

我对超时的理解正确吗

问题:我们希望尽可能减少最终用户了解交易结果所需的时间。为了最大限度地减少延迟,我们决定使用嵌套的TransactionScope拆分代码——每个都有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;
    }
内部bool RootTransaction()
{           
使用(TransactionScope transaction=new TransactionScope())
{
尝试
{
bool result=ChildTransaction();
//结果总是正确的。
如果(!结果)
返回结果;

对于(int counter=0;counter请尝试这样看:

事务的长度仅在调用trans.Complete()或退出事务作用域时确定。请使用以下代码:

using (var trans= new TransactionScope())
{
Threading.Sleep(99999);
trans.Complete()
}
在睡眠例程中没有方法抛出超时异常,如果抛出,也没有意义。因此,使用事务超时(至少以这种方式)只能保证,如果事务花费的时间超过超时时间,则不会提交

如果您只是执行一个查询(我不知道您使用事务的目的是什么),那么您可以设置查询/命令超时(或您所称的任何超时)。IIRC,您的查询将在超时过期后立即返回

另一种方法是设置web服务请求超时,并假设web服务由于事务中的任何内容而花费了太长的时间来响应

编辑: 你可以试试:

  • 在另一个线程上生成事务,然后等待它在主线程(webservice调用使用的线程)上完成(使用thread.Join(timeout))。因此,如果它没有在指定的超时之前终止,则可以停止等待并返回超时错误(别忘了通知另一个线程中止事务)
  • 假设您只在这些事务中执行SQL查询,您可以使用“BeginTransaction”关键字在SQL脚本中指定事务(hacky)。然后,您可以只指定命令超时,并在一行代码中执行所有这些操作。但是,这要求您将在事务中执行的所有操作都移动到一个sql脚本中,这对您来说可能是可能的,也可能是不可能的……而且它不是干净的

用真/假返回码替换异常几乎从来都不是一个好主意。我可以澄清一下:您是否将事务作为web服务调用的一部分使用?此类分布式事务可能真的很致命。或者该事务是web服务实现的本地事务?否。这些事务不是web服务调用的一部分。web服务注释只是设置上下文。服务是原子的,其中一些服务处理需要事务的数据插入。此外,true false仅用于测试目的。我们有单独的日志框架等用于例外。K.对于记录,我不确定我是否会期望子事务得到尊重。最外层的事务使用TS进行操作规则。但超时不应加倍;如果超时为X秒,则它是从第一次执行任何操作开始的X秒,而不是在调用时的X秒,然后是X秒。但这有点棘手,因为在您的示例中,您似乎没有涉及任何事务处理的资源,这使得很难谈论特定的行为。But超时发生在事务本身,而不是操作上。超时正常。默认情况下,如果整个事务花费的时间超过一分钟,它将被中止。我的问题-1)如果子事务本身花费的时间超过一分钟,则不会引发异常2)只有在提交事务时才会检查事务超时(根据其处理情况,可能需要一分钟以上)。建议如何最大限度地减少最终用户的等待时间?我需要最终用户在15秒内返回结果。因此,我将trans拆分为嵌套的trans,超时时间为15秒。看起来不尊重子trans超时。