2009-10-23 104 views
5

在我們當前的項目中,我們使用ADO.NET實體框架作爲應用程序的數據層。有一些任務需要在事務中運行,因爲數據庫中有很多工作要做。我正在使用TransactionScope來圍繞這些任務。MSDTC問題與ADO.NET實體框架中的事務

using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew)) 
{ 
    // Do something... 
    transactionScope.Complete(); 
} 

的問題,一旦是我使用的是TransactionScope發生異常:

System.Data.EntityException:底層提供失敗的打開。 ---> System.Transactions.TransactionManagerCommunicationException:與底層事務管理器的通信失敗。 ---> System.Runtime.InteropServices.COMException(0x80004005):錯誤HRESULT E_FAIL已從調用返回到COM組件。

看來,這個錯誤必須與MSDTC(Microsoft分佈式事務處理協調器)做些什麼。當我更改MSDTC的安全配置時,會引發另一個異常:

System.Data.EntityException:底層提供程序在打開時失敗。 ---> System.Transactions.TransactionManagerCommunicationException:分佈式事務管理器(MSDTC)的網絡訪問已被禁用。請使用組件服務管理工具在MSDTC的安全配置中啓用DTC以進行網絡訪問。

但是,配置了MSDTC,TransactionScope將導致錯誤。 有人知道這裏出了什麼問題嗎?

回答

-2

嗯,看來上班的時候我改變TransactionScopeOption爲「禁止」:

using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Suppress)) 
{ 
    ... 
} 

是否每個人都知道爲什麼嗎?

+4

我認爲它在這種情況下根本不使用交易,但我不確定。 – 2009-10-27 10:54:56

+0

是的,這個選項表明它不應該參與交易。 – 2010-03-17 10:33:55

+1

我得到了同樣的錯誤,但是這不是最好的答案。 – 2010-07-30 12:41:16

7

默認情況下MSDTC禁用網絡訪問。得到它的工作,你應該去

控制面板 - >管理工具 - >組件服務 - >組件 Serivces-> Computes->我的電腦 - >右鍵單擊 - >屬性 - > MSDTC->安全 配置

,並檢查下列複選框網絡DTC訪問,允許入站,允許出站。鑑別應根據你的環境來選擇。您可能還想看看DTCPing工具來調試分佈式事務。爲了給你一個快捷方式 - 你可能需要修改你的註冊表:

HKLM \ SOFTWARE \政策\微軟\的Windows NT \ RPCRestrictRemoteClients = 0 HKLM \ SOFTWARE \政策\微軟\的Windows NT \ RPCEnableAuthEpResolution = 1

讓所有東西都能正常運行。

+0

感謝,DTCPing工具告訴我,有一些RPC終結點錯誤。現在我正在檢查http://support.microsoft.com/kb/306843&http://support.microsoft.com/kb/839880/EN-US/也許這就是解決方案。 – Alexander 2009-10-23 09:02:57

+0

對於Windows 8,可以在這裏找到「安全配置」: http://stackoverflow.com/questions/7694/how-do-i-enable-msdtc-on-sql-server/27263904#27263904 – 2015-06-03 20:04:28

0

這意味着它被抑制,當你輸入你的代碼塊,可能是在效果目前任何交易,因此,如果外部「環境」的交易決定回滾您的代碼的任何更新將不會回滾。

0

這是我們在解決我們自己的,類似的問題使用的文章:

Troubleshooting Problems with MSDTC

這基本上是一個增編Nikolay R's答案。他已經介紹了文章中列出的一些建議。

注意:本文是Biztalk文檔的一部分,但它可以應用於任何使用MSDTC的應用程序。

+0

已更新類似文章 http://msdn.microsoft.com/en-us/library/aa561924.aspx – JeremyWeir 2012-06-28 17:20:32

3

是的,它使用Supress,因爲您告訴它禁止或忽略環境事務並創建新的本地事務。由於交易是本地的,它不是一個分佈式交易,所以它不使用MSDTC,但你可能不應該使用Suppress,而應該使用Required。

0

「如果您使用實體框架和事務,實體框架將自動打開並關閉與每個數據庫調用的連接,因此在使用事務時,您試圖通過多個連接傳出事務,從而升級到MSDTC。

您可以將數據庫上下文傳遞給事務中的被調用者類或函數。

也許這就是你的答案:MSSQL Error 'The underlying provider failed on Open'

0

,如果你想運行一些代碼,可能會失敗Supressing交易是有用的,但你不想放棄,因爲失敗的交易。

,你需要問自己的問題是: 你在你的TransactionScope訪問超過1個耐用資源?我的意思是,你打開超過1個數據庫的連接嗎?

這是一個重要的問題,因爲如果您訪問多個持久資源,交易將升級爲DTC。

支持單相通知

至少兩種持久資源入伍交易。例如,徵用單個連接不會導致事務被提升。但是,無論何時打開數據庫的第二個連接導致數據庫登記,System.Transactions基礎結構都會檢測到它是事務中的第二個持久資源,並將其升級爲MSDTC事務。 來源:

//Create rootScope 
using(TransactionScope rootScope = new TransactionScope()) 
{ 
    using(TransactionScope scope2 = new 
    TransactionScope(TransactionScopeOption.Required)) 
    { 
     //Do work on DB1 
     ... 

     //Complete this ambient transaction 
     scope2.Complete(); 
    } 

    using(TransactionScope scope3 = new 
    TransactionScope(TransactionScopeOption.Required)) 
    { 
     //Do work on DB2 
     ... 

     //Complete this ambient transaction 
     scope3.Complete(); 
    } 

    //Complete rootScope 
    //The whole transaction will only be committed if you call 
    //Complete on the rootScope 
    rootScope.Complete(); 

}

您可以找到有關TransactionScopes更多的信息,是如何工作的嵌套:MSDN

如果是這樣的話,你可以通過正確嵌套的transactionscopes,例如解決您的問題,...在MSDN

我希望這個答案可以幫助未來的人。

0

如果分佈式事務處理協調器服務未啓動,實體框架無法連接到數據庫。 打開並啓動分佈式事務處理協調

服務 - >分佈式事務協調器