2011-08-26 25 views
0

我對EF和事務處理有點問題。EF Transactions MSDTC?

我試圖做到這一點:

using(TransactionScope scope = new TransactionScope()) 
{ 
    using(MyEntities model = new MyEntities()) 
    { 
    MyT thing = new MyT{ Value1 = "bla", Value2 = "bla2", Value3 = "foo" }; 
    model.MyT.AddObject(thing); 
    model.SaveChanges(); 

    thing.Value4 = Service.Call("bar"); 

    // this call causes an exception in MSDTC 
    model.SaveChanges(); 

    scope.Complete(); 
    } 
} 

我之所以這樣做是因爲我想做一個插入到數據庫所以MYT有一個唯一的ID我passto服務當我做該電話然後從服務中獲取唯一的參考和狀態,描述在通話期間發生了什麼,然後我需要追加到記錄中。

我的理解是,一個單一的交易過程中,你只能更新記錄一次/使插入電話,但你不能這樣做既因爲這會產生某種原因出現問題......我曾經有一個MSDN文章說解釋了爲什麼無法完成這個邏輯原因(可能與鎖有關)。

所以我的問題是如何克服這個,但是保證在任何這些調用我仍然可以回滾的任何故障的事件。

+0

你有什麼問題嗎?你發佈的代碼是如何工作的?它看起來對我好。 –

+0

什麼是例外? – JNappi

+0

異常是一個com +異常,它簡單地讀取「在com +對象中發生的異常」,就是這樣...事件中沒有記錄任何沒有幫助的異常。 – War

回答

1

當您在事務範圍內與數據庫建立多個連接時,事務將從本地事務提升爲分佈式事務,除非您明確地使用與db相同的連接。

當交易被提升需要MSDTC服務來管理事務,所以如果此服務不存在,它會拋出異常。

事情是這樣的:

using(TransactionScope scope = new TransactionScope()) 
{ 
    using(MyEntities model = new MyEntities()) 
    { 
    model.Connection.Open(); 
    MyT thing = new MyT{ Value1 = "bla", Value2 = "bla2", Value3 = "foo" }; 
    model.MyT.AddObject(thing); 
    model.SaveChanges(); 

    thing.Value4 = Service.Call("bar"); 

    // this call shouldn't cause anymore an exception in MSDTC 
    model.SaveChanges(); 

    scope.Complete(); 
    } 
} 
+0

該服務正在運行,但這會導致進一步的複雜性,因爲它決定它會給出一個com +異常,在任何日誌中沒有任何有價值的東西,或者在例外情況下給出bac。 – War

+1

儘可能避免使用MSDTC會更高效,請嘗試明確設置連接以避免它。 – TrymBeast

+0

MSDTC升級的另一個變體是在事務中多次打開和關閉連接(儘管我認爲這已在新版本的框架中得到修復)。嘗試重新使用打開的連接,並在交易結束時關閉它。 –