Datenbankübergreifende Transaktionen nicht unterstützt für Datenbankspiegelungs- oder AlwaysOn-Verfügbarkeitsgruppen (SQL Server)

Datenbankübergreifende Transaktionen und verteilte Transaktionen werden von AlwaysOn-Verfügbarkeitsgruppen oder der Datenbankspiegelung nicht unterstützt. Dies ist darauf zurückzuführen, dass die Unteilbarkeit/Vollständigkeit von Transaktionen aus folgenden Gründen nicht gewährleistet werden kann:

  • Für datenbankübergreifende Transaktionen: Jede Datenbank führt einen unabhängigen Commit aus. Aus diesem Grund kann sogar für Datenbanken in einer einzelnen Verfügbarkeitsgruppe ein Failover auftreten, nachdem eine Datenbank für eine Transaktion einen Commit ausgeführt hat, jedoch bevor die andere Datenbank diesen Schritt ausgeführt hat. Bei der Datenbankspiegelung wird dieses Problem verstärkt, da die gespiegelte Datenbank sich nach einem Failover in der Regel auf einer anderen Serverinstanz der anderen Datenbank befindet. Auch wenn beide Datenbanken zwischen denselben beiden Partnern gespiegelt werden, ist nicht garantiert, dass das Failover für beide Datenbanken gleichzeitig ausgeführt wird.

  • Für verteilte Transaktionen: Nach einem Failover kann vom neuen Prinzipalserver bzw. vom primären Replikat keine Verbindung mit dem verteilten Transaktionskoordinator auf dem vorherigen Prinzipalserver bzw. primären Replikat hergestellt werden. Aus diesem Grund kann der neue Prinzipalserver bzw. das neue primäre Replikat den Transaktionsstatus nicht erlangen.

Im folgenden Beispiel zur Datenbankspiegelung wird verdeutlicht, wie eine logische Inkonsistenz auftreten kann. In diesem Beispiel verwendet eine Anwendung eine datenbankübergreifende Transaktion, um zwei Datenzeilen einzufügen: Eine Zeile wird in einer Tabelle in einer gespiegelten Datenbank (A) eingefügt, und die andere Zeile wird in einer Tabelle in einer anderen Datenbank (B) eingefügt. Datenbank A wird im Modus für hohe Sicherheit mit automatischem Failover gespiegelt. Während des Commits der Transaktion fällt Datenbank A aus. Die Spiegelungssitzung führt automatisch ein Failover zum Spiegel von Datenbank A aus.

Nach dem Failover kann ein Commit der datenbankübergreifenden Transaktion möglicherweise erfolgreich für Datenbank B ausgeführt werden, jedoch nicht für die Datenbank, für die der Failover ausgeführt wurde. Dies wäre möglich, wenn der ursprüngliche Prinzipalserver für Datenbank A nicht das Protokoll für die datenbankübergreifende Transaktion vor dem Ausfall an den Spiegelserver gesendet hätte. Nach dem Failover wäre diese Transaktion auf dem neuen Prinzipalserver nicht vorhanden. Datenbanken A und B würden inkonsistent werden, da die in Datenbank B eingefügten Daten erhalten bleiben, während die in Datenbank A eingefügten Daten verloren gingen.

Ein vergleichbares Szenario kann bei einer MS DTC-Transaktion auftreten. Angenommen, der neue Prinzipal setzt sich nach dem Failover mit MS DTC in Verbindung. Der neue Prinzipalserver ist MS DTC jedoch nicht bekannt, deshalb beendet er alle Transaktionen, für die "ein Commit vorbereitet wird", für die in anderen Datenbanken jedoch bereits anscheinend ein Commit ausgeführt wurde.