2008-08-22 71 views
4

我前段時間做了一些測試,從未想出如何使這項工作。是否可以共享.Net應用程序和COM +對象之間的事務?

成分:在IIS

  • COM +事務對象(VB6開發)
  • .NET Web應用程序(與交易),其...
    使得調用COM +組件
    在SQL數據庫更新行

測試:

運行.Net應用程序並強制執行異常。

結果:

從.NET應用程序作出的更新回滾。
由COM +對象所做的更新不會回滾。

如果我從舊的ASP頁面調用COM +對象,回滾就起作用。

我知道有些人可能會想「什麼?!COM +和.Net你一定不會想到!」,但在這個世界上還有一些地方仍然有很多COM +組件。我只是好奇,如果有人遇到過這種情況,並且你想出瞭如何使這項工作。

回答

2

由於VB和.NET將使用不同的SQL連接(並且無法使ADO和ADO.NET共享相同的連接),因此唯一的可能性是爭取DTC(分佈式事務協調器)。 DTC將協調兩個獨立的交易,以便他們提交或回滾到一起。

從.NET,EnterpriseServices管理COM +功能,如DTC。在.NET 2.0和轉發中,你可以使用System.Transactions命名空間,它使事情變得更好一些。我覺得這樣的事情應該工作(未經測試的代碼):

void SomeMethod() 
{ 
    EnterpriseServicesInteropOption e = EnterpriseServicesInteropOption.Full; 
    using (TransactionScope s = new TransactionScope(e)) 
    { 
     MyComPlusClass o = new MyComPlusClass(); 

     o.SomeTransactionalMethod(); 
    } 
} 

我不是這個再熟悉不過了,給你在這一點上更多的建議。

在COM +端,您的對象需要配置爲使用(最有可能「要求」)分佈式事務。您可以通過轉到對象的屬性,選擇交易選項卡,然後單擊「必需」,從COM +資源管理器中執行此操作。我不記得你是否也可以從代碼中做到這一點; VB6是在COM +發佈之前創建的,所以它不能完全支持COM +所做的一切(其事務支持是爲COM +的前身命名的,即MS Transaction Server)。

如果一切工作正常,您的COM +對象應該參與由您的.NET代碼創建的現有上下文。

您可以使用「組件服務」中的「分佈式事務協調器\事務列表」節點來檢查並查看在調用期間創建的分佈式事務。

請注意,您看不到從.NET側的數據查詢反映的來自COM +組件的更改,直到事務提交爲止!事實上,這是可能的僵局!請記住,DTC將確保這兩個事務是成對的,但它們仍然是單獨的數據庫事務。

1

你是如何實施這個的?如果您使用EnterpriseServices來管理.NET事務,那麼這兩個事務都應該回滾,因爲您對它們都使用相同的上下文。

相關問題