In welchen Transaktionsprotokollen werden bei einer datenbankübergreifenden Transaktion die Informationen gespeichert?

8

Angesichts des folgenden Ausschnitts:

-- error checking omitted for brevity
begin tran

exec database1..my_stored_procedure
exec database2..my_other_stored_procedure

if (@@error <> 0)
  rollback

commit

In welche Transaktionsprotokolle der Datenbank werden die Transaktionsinformationen eingefügt?

Ich würde erwarten, dass beide Protokolle alle Daten erhalten, da es keinen Sinn macht, wenn Sie versuchen, database1das Transaktionsprotokoll wiederzugeben, und dies nur diese Datenbank betrifft. Ich würde auch erwarten, dass Sie das database1Transaktionsprotokoll nicht auf einem Server wiedergeben können, auf dem database2es nicht vorhanden war, und umgekehrt.

.. aber ich bin offen für Korrekturen!

Ian Kemp
quelle

Antworten:

12

Das Transaktionsprotokoll zeichnet die ausgeführten SQL-Anweisungen nicht auf, wie Sie es vielleicht erwarten. Stattdessen werden die Änderungen an den Rohdaten in jeder Datenbank unabhängig voneinander aufgezeichnet.

Es ist möglich, dass ein gespeicherter Prozess aus einer Datenbank vollständig im Transaktionsprotokoll einer anderen Datenbank funktioniert.

... database1..my_stored_procedure AS 
BEGIN
INSERT INTO database2..table1 (col1) values (1);
  ^^ changes written to database2's tlog
INSERT INTO database2..table2 (col1) values (2);
  ^^ changes written to database2's tlog
END
^^ when this transaction is committed, COMMIT is recorded in database2's tlog

Oder damit es Änderungen an beiden vornimmt.

... database2..my_other_stored_procedure AS 
BEGIN
INSERT INTO database1..table1 (col1) values (1);
  ^^ changes written to database1's tlog
INSERT INTO database2..table1 (col1) values (2);
  ^^ changes written to database2's tlog
END
^^ when this transaction is committed, COMMIT is recorded in BOTH database1's and database2's tlog

Was im Transaktionsprotokoll aufgezeichnet wird, sind die tatsächlichen Datenänderungen , nicht die SQL-Anweisungen, die sie verursacht haben. Die Einträge in jede Transaktionsprotokolldatei sind völlig unabhängig, außer insofern, als COMMIT nach dem Festschreiben der Transaktion gleichzeitig in die beiden Protokolldateien geschrieben wird.

Die gleiche Logik gilt, wenn bei einer größeren Transaktion mehrere gespeicherte Prozeduren in mehreren Datenbanken ausgeführt werden. Sobald Sie Ihre Transaktion festschreiben, wird das COMMIT im Protokoll jeder Datenbank aufgezeichnet, die an der Transaktion teilgenommen hat.

Es ist durchaus möglich, eine Sicherung von Datenbank2 wiederherzustellen und die Transaktionsprotokolle auf einem Server ohne Datenbank1 wiederzugeben.

Dieses Verhalten ermöglicht eine gewisse Flexibilität bei der Anordnung von Prozeduren und Ansichten in SQL Server. Viele Datenbankadministratoren speichern ihre gespeicherten Prozeduren - insbesondere die Wartungsprozeduren - in einer Datenbank (z. B. Admin), die vollständig von Anwendungs- / Benutzerdatenbanken getrennt ist, und schreiben die Ergebnisse des Wartungsvorgangs in diese Datenbank. Zum Glück ist es möglich, eine der Benutzerdatenbanken auf einem Entwicklungsserver wiederherzustellen, ohne dass auch ein Kopieren erforderlich ist Admin.

Nathan Jolly
quelle