错误:超时间隔必须小于2 ^ 32-2。参数名称:dueTm

时间:2009-12-26 18:04:19

标签: c# asp.net ado.net

我的班级模型中有一对多的关系。

实施例: 单个角色可以附加许多权限。所以有两个来自角色的表1和一个用于每个角色的权限。

现在我有一个角色类,而角色类又有一个权限列表作为该类的成员。当我需要进行更新时,我实例化一个transactionscope对象,并对该角色进行更新。完成此操作并且transactionscope仍然打开后,我会为列表中的每个权限打开另一个transactionscope,并在更新完成后立即关闭它。

角色的更新工作正常

但是,现在的问题是,当它试图为列表中的第一个权限实例化一个事务管理器时,它会产生一个错误:

Error: Time-out interval must be less than 2^32-2. Parameter name: dueTm

3 个答案:

答案 0 :(得分:2)

好的,我找到了解决方案。

方案: 我的业务层有两个基类,BaseBLLBaseListBLL。这些类中的每一个都提供了一个调用astract方法的方法,该方法必须在具体类中实现。这些类在切换到抽象类之前启动TransactionScope以执行更新或插入等任务。

注意:在BaseListBLL启动TransactionScope之后,它会调用BaseBLL中也启动它自己的事务的方法。这是因为,我们将插入或更新从BaseBLL派生的类列表,这些类都包含在派生自BaseListBLL的类中。

现在,例如,如果我们要更新角色表中的角色,则只会启动一个事务。但是现在复杂性来自于我们有一个角色对象,而另一个类直接来自BaseListBLL

首先为列表启动一个事务,为列表中的每个BaseBLL对象启动另一个事务,以执行所有插入或更新。

所以现在,在第一次插入后,错误:

Error: Time-out interval must be less than 2^32-2. Parameter name: dueTm

被抛出。

我做的是

对于列表类,我以这种方式设置TranscationScope对象:

TransactionScope ts = new TransactionScope(TransactionScopeOption.Suppress)

和其他班级

TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue)

我得出的结论是错误被抛出,因为我使用了列表中BaseBLL派生类创建的相同事务。当需要更新项目列表时,我不得不压制环境事务。

我希望这有助于其他人。

答案 1 :(得分:1)

我们遇到了类似的问题,答案很简单,找到in this thread

正在发生的事情是外部TransactionScope和内部TransactionScope超时不匹配。内部TransactionScope正试图将自己设置为大于外TransactionScope的内容。

这是怎么发生的?答案是我们将Timeout设置为等于TimeSpan.MaxValue ...但是......这个限制实际上是TransactionManager.MaximumTimeout。因此,当内部TransactionScope设置超时时,它会爆炸,因为它是一个大于外部TransactionScope的值。

嵌套交易时会出现问题:

public static TransactionScope CreateTransactionScope()
        {
            var transactionOptions = new TransactionOptions
            {
                IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted,
                Timeout = TimeSpan.MaxValue
            };

            return new TransactionScope(TransactionScopeOption.Required, transactionOptions);
        }

嵌套交易时效果很好:

public static TransactionScope CreateTransactionScope()
        {
            var transactionOptions = new TransactionOptions
            {
                IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted,
                Timeout = TransactionManager.MaximumTimeout
            };

            return new TransactionScope(TransactionScopeOption.Required, transactionOptions);
        }

回答的人声称这是一个已知的错误。在我看来,如果将Timeout设置为大于TransactionManager.MaximumTimeout的值而不是在内部TransactionScope尝试设置值时抛出异常,那么修复将只是“快速失败”并抛出异常大于外TransactionScope

答案 2 :(得分:0)

System.Transactions.TransactionScope的源代码表明它会在某些情况下创建System.Threading.Timer实例。计时器要求dueTime.TotalMilliseconds不应大于0xfffffffeL,但传递给dueTime的值为TimeSpan.MaxValue0x7fffffffffffffffL以刻度表示,即0x346DC5D638865以毫秒为单位)。这就是抛出异常的原因。

所以我认为更好的解决方案是给TransactionScope一个更小的超时。