Ist es möglich, eine Transaktion zwischen einer .Net-Anwendung und einem COM+-Objekt zu teilen?

StackOverflow https://stackoverflow.com/questions/21589

Frage

Ich habe vor einiger Zeit einige Tests durchgeführt und nie herausgefunden, wie das funktioniert.

Die Zutaten:

  • COM+-Transaktionsobjekt (entwickelt in VB6)
  • .Net-Webanwendung (mit Transaktion) in IIS, die ...
    ruft die COM+-Komponente auf
    aktualisiert eine Zeile in einer SQL-Datenbank

Testen:

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

Ergebnis:

Das von der .Net-Anwendung durchgeführte Update wird zurückgesetzt.
Das vom COM+-Objekt vorgenommene Update wird nicht rückgängig gemacht.

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

Ich weiß, dass einige Leute vielleicht denken: „Was?!“COM+ und .Net, Sie müssen verrückt sein!“, aber es gibt einige Orte auf dieser Welt, an denen es immer noch viele COM+-Komponenten gibt.Ich war nur neugierig, ob jemals jemand damit konfrontiert wurde und ob Sie herausgefunden haben, wie das funktioniert.

War es hilfreich?

Lösung

Da VB und .NET unterschiedliche SQL-Verbindungen verwenden (und es keine Möglichkeit gibt, ADO und ADO.NET die gleiche Verbindung zu teilen), besteht Ihre einzige Möglichkeit darin, den DTC (Distributed Transaction Coordinator) zu engagieren.Der DTC koordiniert die beiden unabhängigen Transaktionen, sodass sie gemeinsam festgeschrieben oder zurückgesetzt werden.

Von .NET, EnterpriseServices verwaltet die COM+-Funktionalität, beispielsweise den DTC.In .NET 2.0 und höher können Sie den System.Transactions-Namespace verwenden, was die Sache etwas angenehmer macht.Ich denke, so etwas sollte funktionieren (ungetesteter Code):

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

        o.SomeTransactionalMethod();
    }
}

Ich bin damit nicht vertraut genug, um Ihnen an dieser Stelle weitere Ratschläge zu geben.

Auf der COM+-Seite, muss Ihr Objekt für die Verwendung einer verteilten Transaktion konfiguriert werden (höchstwahrscheinlich „erfordern“).Sie können dies im COM+ Explorer tun, indem Sie zu Ihrem Objekt gehen Eigenschaften, Auswahl der Transaktion Registerkarte und klicken Sie auf „Erforderlich".Ich kann mich nicht erinnern, ob Sie dies auch über Code tun können.VB6 wurde vor der Veröffentlichung von COM+ erstellt und unterstützt daher nicht alle Funktionen von COM+ vollständig (die Transaktionsunterstützung war für den Vorgänger von COM+, den sogenannten MS Transaction Server, gedacht).

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

Sie können den Knoten „Distributed Transaction Coordinator ransaction List“ in „Component Services“ verwenden, um die verteilte Transaktion zu überprüfen und zu sehen, die während des Aufrufs erstellt wird.

Beachten Sie, dass Sie die Änderungen der COM+-Komponente, die sich in Datenabfragen von der .NET-Seite widerspiegeln, erst sehen können, wenn die Transaktion festgeschrieben wurde!Tatsächlich ist ein Deadlock möglich!Denken Sie daran, dass DTC sicherstellt, dass die beiden Transaktionen gepaart sind, es sich aber dennoch um separate Datenbanktransaktionen handelt.

Andere Tipps

Wie setzen Sie das um?Wenn Sie EnterpriseServices zum Verwalten der .NET-Transaktion verwenden, sollten beide Transaktionen zurückgesetzt werden, da Sie für beide denselben Kontext verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top