2009-04-07 69 views
1

我有一個服務級別的方法,這使得數據庫的變化很少,我希望他們使用事務控制。這些方法可以做到: - LINQ SubmitChanges()功能 - 調用存儲過程TransactionScope,LINQ和奇怪的事務管理器問題(HRESULT:0x8004D024)

組件用戶可以將這些基本操作的集合組合成更大的東西。

我看到有一個很好的類TransactinScope並試圖使用它:

using (TransactionScope transaction = new TransactionScope()) 
{ 
    content = repository.CreateBaseContent(content); 
    result = repository.CreateTreeRelation(content, parent.Id, name); 
    transaction.Complete(); 
} 

public baseContent CreateBaseContent(baseContent content) 
{ 
     EntityContext.baseContents.InsertOnSubmit(content); 
     EntityContext.SubmitChanges(); 

     return content; 
} 

public CreateTreeRelation (params) 
{ 
// do StoredProcedure call here via LINQ 
} 

我的假設是,在外層將有可能增加交易範圍的另一個層次。相反,我有以下錯誤:

事務管理器已禁用其對遠程/網絡事務的支持。 (異常來自HRESULT:0x8004D024)

我使用相同的(Vista旗艦版)機器爲MS SQL 2005和微軟開發服務器。從單元測試一切正常。當TransactionScope評論時相同。

我試圖與安全方面發揮的DTC(http://support.microsoft.com/kb/899191),當我設置爲acccept所有入站和出站的交易,我有以下錯誤信息:

錯誤HRESULT E_FAIL已從調用返回至COM零件。

調試過程中,我發現在的SubmitChanges,LINQ的實體上下文產權交易IS NULL(!),並System.Transactions.Transaction.Current有打開的事務

回答

2

問題發生,因爲LINQ的DataContext的是之前的TransactionScope創建。

解決方案是將自己的事務控制添加到LINQ datacontext。

Connection.Open() 
Transaction = Connection.BeginTransaction(); 

和計數器維護嵌套調用。

3

我想你也可以使用TransactionScope,只要你傳遞datacontexts的同一個連接你打開。

您使用TransactionScope獲得的另一個問題是,它不在乎連接字符串是否相同,執行一秒.Open會將事務提升爲分佈式事務。然後,你必須處理相關的配置,以及它不使用輕量事務的情況。