2009-12-26 70 views
1

我在班级模型中有一对多的关系。错误:超时间隔必须小于2^32-2。参数名称:dueTm

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

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

该角色的更新工作得很好

但是,现在的问题是,当它试图实例化一个TransactionScope对名单上的第一个允许它trows一个错误说:

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

我相信问题是关于.NET Framework事务:http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx可能与ADO.NET和/或SQL Server 2008有关 – brianpeiris 2009-12-26 18:09:58

+0

是的。你是对的。 – Tebo 2009-12-26 18:11:21

回答

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 

被抛出。

我所做的就是

List类的,我设置了TranscationScope对象是这样的:

TransactionScope ts = new TransactionScope(TransactionScopeOption.Suppress) 

和其他类

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

我已经得出的结论是:错误是由于我使用由列表中的BaseBLL派生类创建的相同事务而引发的。当需要更新项目列表时,我必须抑制环境事务。

我希望这可以帮助别人。

0

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

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

1

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

发生什么事是外TransactionScope和内TransactionScope有一个超时不匹配。内部TransactionScope正试图将自己设置为比外部更大的东西TransactionScope

这是怎么发生的?答案是,我们将超时设置为等于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); 
     } 

谁回答索赔的人,这是一个已知的bug。在我看来,如果超时设置为大于TransactionManager.MaximumTimeout的值,则修复将仅仅是'失败快'并抛出异常,而不是在内部TransactionScope尝试设置大于外部TransactionScope的值时抛出异常。

相关问题