2009-04-27 60 views
3

超奇怪的事情在這裏發生。TransactionScope超時奇怪與TransactionScopeOption.RequiresNew

我只是增加了一個交易範圍周圍的一些遺留代碼,我調試,以確保我做不會得到犯下的擺弄。

這個工作兩次,然後說:

"The transaction manager has disabled its support for remote/network transactions." 

無需更改任何代碼或工作/ nonworkingness之間重建(字面3個F5s連續[web應用程序])。這是連接到刪除數據庫服務器的本地代碼。

由於這,在一個不同的項目完全獨立的碼超時。如果我從這段代碼中刪除了transactionScopes,它運行良好,但是在它們到位的情況下它會超時。我試過我的本地SQL服務器和遠程服務器,都在transactionScope中超時。

這到底是怎麼回事?

編輯:我發現,從改變我的TransactionScopes:

using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew)) 

using (var scope = new TransactionScope()) 

防止問題:■

這是什麼意思?

+0

你能告訴我們的代碼,請... – 2009-04-27 10:43:03

+0

不容易,我嘗試創建一個簡單的例子來複制它。敬請關注 – 2009-04-27 10:52:48

回答

0

我相信,當發生錯誤是該框架正試圖推動原有的「輕量級」(即DBMS)交易的「分佈式」的交易發生了什麼。管理分佈式事務的MSDTC(分佈式事務協調器)服務未運行或無法工作。

此,當一個邏輯事務跨越兩個(或更多)的數據庫連接通常發生。當然,在你的情況下(顯然)只有一個DBMS連接。我猜迫使一個新的,獨立的事務範圍,你也迫使框架使用分佈式事務。

+0

這個傢伙有一個非常類似的問題,如果這個棚子更多的光http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic62511.aspx – 2009-04-27 12:28:14

3

之間的差異:

using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew)) 

using (var scope = new TransactionScope()) 

是第二一個重用現有的(環境)事務,而第一個舊的內創建一個新的事務。

事務中的此交易需要分佈式事務處理協調器。

有那麼你的錯誤三分可能的理由:

  • 的MSDTC不運行
  • 你的數據庫是在不同的機器上和窗戶被配置爲不允許從網絡交易。
  • 你的數據庫是在不同的機器上,並且SQL服務器配置爲不允許從網絡
0

老問題事務,但我有同樣的問題,所以這裏的簡單信息來解決多類問題。

如果,如果你真的需要明確對嵌套事務的行爲,並考慮通過閱讀this MSDN article設定明確的那種交易範圍,可以改變從TransactionScopeOption.RequiresNewTransactionScopeOption.Required檢查。可能你的問題是具有鎖定資源的新交易的數量,這就是爲什麼這個問題是「怪異的」。

另外,你應該檢查這個信息:

The default transaction scope is considered harmful

using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew)) 

默認設置:

  1. 的IsolationLevel爲Serializable(考慮使用IsolationLevel.ReadCommitted
  2. 超時一個分鐘(考慮使用TransactionManager.MaximumTimeout

有了這兩個選項和TransactionScopeOption.RequiresNew,您應該會發現死鎖。

這裏的新代碼:

new TransactionScope(TransactionScopeOption.Required, 
    new TransactionOptions 
    { 
     IsolationLevel = IsolationLevel.ReadCommitted, 
     Timeout = TransactionManager.MaximumTimeout 
    } 
)