2008-08-22 8 views
4

Ich habe vor einiger Zeit einige Tests gemacht und nie herausgefunden, wie das funktioniert.Ist es möglich, eine Transaktion zwischen einer .Net-Anwendung und einem COM + -Objekt zu teilen?

Die Zutaten:

  • COM + Transaktionsobjekt (in VB6 entwickelt)
  • .Net Web-Anwendung (mit der Transaktion) in IIS, die ...
    einen Aufruf an die COM + Komponente macht
    aktualisiert eine Zeile in einer SQL-Datenbank

Prüfung:

Führen Sie die .NET-Anwendung aus, und erzwingen Sie eine Ausnahme.

Ergebnis:

Das Update von der Net-Anwendung gemacht rollt wieder.
Das vom COM + -Objekt vorgenommene Update wird nicht zurückgesetzt.

Wenn ich das COM + -Objekt von einer alten ASP-Seite aufrufen, funktioniert das Rollback.

Ich weiß, dass einige Leute denken "was? COM + und. Net Sie müssen aus Ihrem Kopf sein!", Aber es gibt einige Orte auf dieser Welt, wo es immer noch viele COM + -Komponenten gibt. Ich war nur neugierig, ob jemand das jemals gesehen hat und ob du herausgefunden hast, wie es funktioniert.

Antwort

2

Da VB und .NET verschiedene SQL-Verbindungen verwenden (und es keine Möglichkeit gibt, ADO und ADO.NET für die gleiche Verbindung freizugeben) besteht die einzige Möglichkeit darin, das DTC (Distributed Transaction Coordinator) zu registrieren. Das DTC wird die zwei unabhängigen Transaktionen koordinieren, so dass sie zusammenkommen oder zusammen zurückgesetzt werden.

Von .NET verwaltet EnterpriseServices COM + -Funktionalität wie den DTC. In .NET 2.0 und forward können Sie den System.Transactions-Namespace verwenden, der die Dinge ein wenig schöner macht. Ich denke, so etwas wie dies sollte (ungetestet Code) arbeiten:

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

     o.SomeTransactionalMethod(); 
    } 
} 

Ich bin nicht vertraut genug mit diesem Ihnen mehr Beratung an dieser Stelle zu geben.

Auf der COM + -Seite muss Ihr Objekt konfiguriert werden, um eine verteilte Transaktion zu verwenden (wahrscheinlich "erforderlich"). Sie können dies von COM + Explorer aus tun, indem Sie Eigenschaften Ihres Objekts gehen, die Transaktion Registerkarte auswählen, und klicken Sie auf "Erforderlich". Ich kann mich nicht erinnern, ob du das auch aus Code machen kannst; VB6 wurde erstellt, bevor COM + veröffentlicht wurde, also unterstützt es nicht alles, was COM + tut (seine transaktionale Unterstützung war für den Vorgänger von COM +, genannt MS Transaction Server, gedacht).

Wenn alles ordnungsgemäß funktioniert, sollte Ihr COM + -Objekt in den vorhandenen Kontext, der von Ihrem .NET-Code erstellt wurde, aufgenommen werden.

Sie können den Knoten "Distributed Transaction Coordinator \ Transaction List" in "Komponentendienste" verwenden, um die verteilte Transaktion, die während des Aufrufs erstellt wird, zu überprüfen und anzuzeigen.

Beachten Sie, dass die Änderungen der COM + -Komponente, die sich auf Datenabfragen von der .NET-Seite widerspiegeln, erst sichtbar werden, wenn die Transaktion festgeschrieben ist! In der Tat ist es möglich, zu blockieren! Denken Sie daran, dass DTC sicherstellen wird, dass die beiden Transaktionen gepaart sind, aber sie sind immer noch separate Datenbanktransaktionen.

1

Wie implementieren Sie das? Wenn Sie Enterprise Services zum Verwalten der .NET-Transaktion verwenden, sollten beide Transaktionen zurückgesetzt werden, da Sie für beide den gleichen Kontext verwenden.