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.