2009-05-20 4 views
6

Ich verwende das .NET 2.0/3.5-Framework für meine Anwendung. Ich muss mehrere SQL-Befehle über mehrere Verbindungen ausführen und jede Verbindung ist auf einem anderen Server (Oracle, SQL Server). Ich muss sicherstellen, dass diese Befehle transaktional sind.Mehrere SQL-Transaktionsbefehle über verschiedene Datenbankverbindungen

Zum Beispiel: Ich muss eine INSERT in einer Tabelle sowohl Oracle und SQL Server-Datenbanken durchführen, dann Commit sie, wenn keine Ausnahmen geworfen wurden. Wenn es eine Ausnahme gibt, möchte ich bei Bedarf auf beiden Servern einen Rollback durchführen.

Ich vermute, ich muss System.Transactions und TransactionScope verwenden. Dies erfordert, dass ich den Microsoft Distributed Transaction Coordinator (MSDTC) auf den Datenbankservern und auch auf dem Anwendungsserver eingerichtet habe.

Ich habe hoch und niedrig geschaut und konnte keine Artikel finden, die MSDTC schrittweise mit gegenseitiger Authentifizierung (einschließlich der Konfiguration von Firewall-Einstellungen und MSDTC-Einstellungen) beschreiben. Ich schaute auf die Microsoft-Dokumentation zum Einrichten von MSDTC, aber es scheint völlig wertlos und nicht vollständig dokumentiert (es sei denn, Sie finden mich einen wirklich guten MSDN-Artikel, wie man es aufstellt.)

Ist MSDTC der einzige Weg, um meine Arbeit zu erledigen?

Wenn ja, wie zum Teufel konfiguriere ich es richtig?

EDIT:

  • Ich verwende Windows Server 2003 für alle Maschinen.
  • Ich habe zwei SQL Server. Einer ist SQL Server 2000 und der andere ist 2005.
  • Ich habe einen Oracle-Server und es ist Version 11g
  • Die Anwendung, die wir entwickeln, muss manchmal ändern/Datensätze in allen drei Datenbanken in einer transaktionalen Weise erstellen.
  • Es ist kein Problem zwischen der Tastatur und dem Stuhl. Wir lesen die MSDN-Artikel darüber, wie alles in Bezug auf MSDTC eingerichtet wird, aber wir können DTCPing und andere Testanwendungen nicht zum Laufen bringen. Wir suchten nach einem Schritt-für-Schritt-Artikel, der den Prozess genau beschreibt. Ich bin bei mehr als einer Gelegenheit auf MSDN-Dokumentation gestoßen, die bestimmte Schritte "ausgelassen" hat.

Antwort

5

Leider scheint sowohl offizielle Dokumentation von beiden Anbietern glücklich, den Interop-Anbieter oder den anderen zu erwähnen, aber beide scheinen nicht zu erkennen, die Existenz der anderen Datenbank-Angebot.

Möglicherweise möchten Sie die Dokumentation auf Oracle Services for Microsoft Transaction Server.

  • Oracle Dokumentation:
    • 10g
    • 9i
    • Ältere Versionen existieren, aber viel erscheint nach 8

Von ODP.NET 10.2.0.3 weiter verändert zu haben Sie sollten (wenn Sie MS DTC und die OraMTS dll ist vorhanden) Sie können einfach das TransactionScope von System.Transactions verwenden, genauso wie Sie es tun würden, wenn Sie zwischen zwei SQL Server-Datenbanken koordinieren, aber einen SQL-Server und eine Oracle-Verbindung verwenden. Ab Oracle 10 kann es erforderlich sein, dass das System einfach out of the box funktioniert.

Here is a guide to using DTC from .net 2.0 and Sql Server 2005 onwards. Insbesondere werden die OS-Anforderungen notiert (die größtenteils kein Problem mehr darstellen sollten, aber erwähnenswert sind). Wenn sich nicht gleichzeitig beide Datenbanken und der Client auf demselben Computer befinden, muss der Netzwerk-DTC aktiviert sein.

1

Ich verwende Verbindungsserver für alle meine Aufgaben wie diese. Es erleichtert uns die Verwaltung von Verbindungsinformationen und Anmeldeinformationen. Grundsätzlich One-Stop-Shopping für alle unsere Bedürfnisse.

Bearbeiten: Weitere Details - Wir haben eine Datenbank ausschließlich für die Berichterstattung verwendet. Wir bekommen unsere Daten vom Server im gesamten Unternehmen. Wir haben kein einziges Konto, um auf diese Server zuzugreifen. Einige von ihnen verwenden eine funktionale ID, andere unsere AD-Anmeldeinformationen. Alle diese Verbindungen in separate Verbindungsserver zu integrieren, hat für uns am besten funktioniert. Auf unserem Berichtsserver haben wir derzeit 16 verbundene Server.

Wir schließen auch unsere Abfragen in Ansichten für einen einfacheren Zugriff auf unsere Anwendungen und Crystal Reports. Anstatt also mehrere Verbindungszeichenfolgen in unserem Code zu erstellen, verwenden wir nur eine einzige globale Zeichenfolge, um eine Verbindung zum Berichts-DB herzustellen.

0

Dies ist ein klassisches verteiltes Transaktionsproblem und genau das ist MSDTC. Weitere Informationen zu dieser Problemklasse finden Sie in Transaktionsmonitoren und im XA-Protokoll.

0

Wenn mehrere Verbindungen verwendet werden, müssen Sie den Fehlercode (DTC) verwenden.Eine einzelne Verbindung kann eine einzelne Transaktion verwalten. Wenn Sie jedoch mehrere Verbindungen haben, benötigen Sie einen Transaktionskoordinator, um das Protokoll für zweiphasige Festschreibung zu verarbeiten.

1

Meine Antwort könnte etwas komisch sein, aber ich empfehle Ihnen (wenn es technisch möglich ist), die Verwendung von 2 unabhängigen Transaktionen für jede Datenbank zu bewerten. Meine Sorge bezüglich verteilter Transaktionen/XA ist die allgemeine Datenbankperformance/Skalierbarkeit/Latenz.

2 Links, die meiner Sicht wird versuchen zu beweisen.

  1. Martin Fowler notes: „Sie müssen achten Sie auf die Reihenfolge der Commits, die wichtigeren in erster bekommen An jedem Sie zu begehen überprüfen Sie, ob es erfolgreich war und entscheiden Sie, was zu tun ist, wenn es fehlschlägt. "
  2. Interview regarding eBay architecture
-1

Ja, werden Sie einen Transaktionsbereich und die ADO.Net Provider für SQL und Oracle wird jede Verbindung zu einem einzigen verteilten Transaktion, koordiniert von MSDTC erstellen müssen einschreiben.

Die MSDN-Dokumentation zum Einrichten von MSDTC ist ziemlich ausführlich und behandelt speziell die Fragen, die Sie stellen: Enable Firewall Exceptions for MS DTC, Configuring Security for Distributed Transactions.

Sie erwähnen nicht das Betriebssystem Ihres Clients, die SQL Server-Version, die Oracle-Version, das Back-End-Betriebssystem für SQL Server und Oracle (s). Sie vernachlässigen auch zu sagen, tatsächlichen Problem aufgetreten oder Fehlermeldung, die Sie gesehen haben. Im Moment scheint das Problem irgendwo zwischen Tastatur und Stuhl zu liegen.

Verwandte Themen