我的班级模型中有一对多的关系。
实施例: 单个角色可以附加许多权限。所以有两个来自角色的表1和一个用于每个角色的权限。
现在我有一个角色类,而角色类又有一个权限列表作为该类的成员。当我需要进行更新时,我实例化一个transactionscope
对象,并对该角色进行更新。完成此操作并且transactionscope
仍然打开后,我会为列表中的每个权限打开另一个transactionscope
,并在更新完成后立即关闭它。
角色的更新工作正常
但是,现在的问题是,当它试图为列表中的第一个权限实例化一个事务管理器时,它会产生一个错误:
Error: Time-out interval must be less than 2^32-2. Parameter name: dueTm
答案 0 :(得分:2)
好的,我找到了解决方案。
方案:
我的业务层有两个基类,BaseBLL
和BaseListBLL
。这些类中的每一个都提供了一个调用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.MaxValue
(0x7fffffffffffffffL
以刻度表示,即0x346DC5D638865
以毫秒为单位)。这就是抛出异常的原因。
所以我认为更好的解决方案是给TransactionScope
一个更小的超时。