2009-12-26 74 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的值時拋出異常。

相關問題