2008-08-22 16 views
4

Bir süre önce bazı testler yaptım ve bu işi nasıl yapacağımı asla anlayamadım.
COM + bileşeni
bir çağrı yapar ... IIS'de (VB6 geliştirilen)Bir .Net uygulaması ve COM + nesnesi arasında bir işlem paylaşmak mümkün mü?

  • COM + işlem nesnesi (işlemle)
  • .Net web uygulaması:

    maddeler SQL veritabanında güncellemeleri bir satır

Test:

.Net uygulamasını çalıştırın ve bir istisna zorlayın.

Sonuç:

Net uygulaması yapılan güncelleme geri alır.
COM + nesnesi tarafından yapılan güncelleştirme geri alınmaz.

Eski bir ASP sayfasından COM + nesnesini çağırırsam, geri alma çalışır.

Bazı insanlar "ne ?! COM + ve .Net aklınızdan çıkarılmanız gerektiğini" düşünüyor olabilir, ancak bu dünyada hala birçok COM + bileşeninin bulunduğu bazı yerler var. Birisi bununla yüz yüze geldiyse ve bu işi nasıl yapacağınızı anladıysanız merak ettim.

cevap

2

VB ve .NET farklı SQL bağlantıları kullanacağından (ve ADO ve ADO.NET'in aynı bağlantıyı paylaşma yolu olmadığından), tek olasılığınız DTC'yi (Dağıtılmış İşlem Düzenleyicisi) kaydetmektir. DTC, iki bağımsız işlemi koordine edecek ve böylece bir araya getirilecek veya geri alınacaktır.

.NET'dan EnterpriseServices, DTC gibi COM + işlevlerini yönetir. .NET 2.0 ve ileride, işleri biraz daha güzel yapan System.Transactions ad alanını kullanabilirsiniz. Böyle bir şey (denenmemiş kodu) çalışması gerekir düşünüyorum:

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

     o.SomeTransactionalMethod(); 
    } 
} 

Ben bu noktada daha fazla öneride için bu yeterince aşina değilim.

COM + tarafında üzerinde, nesnenizin dağıtılmış bir işlemi (büyük olasılıkla "gerektirir") kullanması için yapılandırılması gerekir. Nesnenin Özellikleri'a gidip, İşlemi sekmesini seçip "Gerekli" seçeneğini tıklatarak COM + Gezgini'nden yapabilirsiniz. Bunu koddan da yapabilir misin hatırlamıyorum; VB6, COM + yayımlanmadan önce oluşturuldu, bu nedenle, COM + yaptığı her şeyi tam olarak desteklemiyor (onun işlem desteği, COM + 'un önceki adı, MS Transaction Server olarak adlandırılmıştı).

Her şey doğru şekilde çalışıyorsa, COM + nesnesiniz, .NET kodunuz tarafından oluşturulan mevcut Bağlam içinde yer almalıdır.

Arama sırasında oluşturulan dağıtılmış işlemi kontrol etmek ve görmek için "Bileşen Hizmetleri" içindeki "Dağıtılmış İşlem Düzenleyicisi \ İşlem Listesi" düğümünü kullanabilirsiniz.

İşlem gerçekleştirilinceye kadar .NET tarafındaki veri sorgularına yansıyan COM + bileşenindeki değişiklikleri göremeyeceğinizi unutmayın! Aslında, deadlock mümkün! DTC'nin, iki işlemin eşleştirildiğini, ancak yine de ayrı veritabanı işlemleri olduğundan emin olacağını unutmayın.

1

Bunu nasıl uyguluyorsunuz? .NET işlemini yönetmek için EnterpriseServices'ı kullanıyorsanız, her ikisi için de aynı bağlamı kullandığınızdan, her iki işlem de geri alınmalıdır.