Ich sehe oft Anweisungen wie SQL Server Logs, die jede Transaktion und jeden Vorgang aufzeichnen.
Aber ich bin verwirrt über das, was passiert , wenn eine Transaktion schließlich wird gerollt zurück .
Sprich eine explizite Transaktion hat drei Aussagen: statement A
, statement B
, statement C
, und schließlich ein rollback
statement D
.
Sagen Sie nun, wenn die Ausführung das nicht erreicht hat rollback statement D
, werden die Änderungen, die von resultieren statements A through C
, im SQL Server-Protokoll aufgezeichnet?
Verständnis 1 :
Die Anweisungen A bis D werden alle aufgezeichnet. SQL Server zeichnet alles auf, egal was passiert.
Grundlegendes zu 2 : Änderungen werden nur irgendwo im Speicher gespeichert und nur aufgezeichnet, um zu protokollieren, wenn SQL Server eine commit
Anweisung sieht . Wenn sich herausstellt, dass es sich um eine rollback
Anweisung handelt, ignoriert SQL Server die Transaktion einfach. Es wird kein Protokoll geschrieben, da dies keinen Zweck erfüllt. Mit anderen Worten, protokolliert SQL Server , wenn eine ist Netto- Ergebnis vor und nach den Transaktionen.
Beides erscheint mir logisch, kann aber nicht richtig sein. Danke für jede Hilfe.
quelle
Antworten:
Verständnis 1 ist richtig. SQL Server zeichnet jeden Vorgang auf, der Daten im Transaktionsprotokoll ändert. Ein Rollback ist eine Datenänderung, die auch im Transaktionsprotokoll aufgezeichnet wird. Bei Ausführung von Anweisung A werden Daten in das Transaktionsprotokoll geschrieben und Daten im Transaktionsprotokoll reserviert, falls Anweisung A zurückgesetzt werden muss. Gleiches gilt für B und C. Wenn Sie die Transaktion zurücksetzen, werden weitere Informationen in das Protokoll geschrieben.
Es gibt viele Möglichkeiten, dies in Aktion zu sehen. Im Folgenden finden Sie eine kurze Demo. Hier ist die Abfrage, die ich verwenden werde, um zu sehen, was in das Protokoll geschrieben wurde:
Mein Tisch:
Abfrage A verwendet minimale Protokollierung:
Nach einer:
Abfrage B verwendet keine minimale Protokollierung:
Nach B:
Abfrage C ändert weniger Daten:
Nach C:
Jetzt werde ich ein ausstellen
ROLLBACK
und die DMV abfragen, während das Rollback stattfindet. Unten finden Sie eine Tabelle mit einigen Schnappschüssen:Währenddessen nehmen die
ROLLBACK
verwendeten Bytes zu und die reservierte Anzahl von Bytes ab. Dies liegt daran, dass SQL Server den zuvor reservierten Speicherplatz verwendet, um die Transaktion rückgängig zu machen. Um die Transaktion rückgängig zu machen, müssen Daten geändert werden, damit mehr Daten in das Protokoll geschrieben werden.quelle
Änderungen an Datenbanktabellen werden zuerst in die Protokolldatei und dann in die Tabellen selbst geschrieben, zuerst im Speicher und dann mit einem asynchronen Prozess
CHECKPOINT
auf die Festplatte. Dieser Mechanismus ist als WAL (Write-Ahead Logging) bekannt und allen relationalen Datenbanken gemeinsam.Das Protokoll selbst wird zuerst in den Speicher (genau in den Protokollpuffer) und dann auf die Festplatte geschrieben, die Datenbanktabellen werden jedoch erst dann berührt, wenn das Protokoll auf die Festplatte geschrieben wurde.
Dieser Mechanismus ermöglicht sowohl das Rollback von festgeschriebenen Transaktionen als auch das Rollback von nicht festgeschriebenen Transaktionen während des Wiederherstellungsprozesses. In Bezug auf Ihr Beispiel hätte das RDBMS keine Möglichkeit, die Datenbank in einer konsistenten Form wiederherzustellen , wenn etwas Schlimmes danach passiert wäre
statement C
und Siecommit
anstelle vonrollback
(das können Sie nicht im Voraus wissen) ein hatten, ohne jeden Schritt in der Transaktion zu speichern Art und Weise und die Transaktion würde dieD
(Haltbarkeit) in nicht erfüllenACID
.Wenn einige Operationen rückgängig gemacht , es ist die Datendatei, die die Nettoänderungen empfängt (über
CHECKPOINT
), nicht die Protokolldatei.quelle
Verständnis 1 ist richtig und Spaghettidba und Joe haben gute Erklärungen.
Wenn Sie selbst testen möchten (bitte auf einer Testinstanz), können Sie das folgende Skript verwenden:
Sie werden feststellen, dass SQL Server alles aufzeichnet, auch die Schritte, die zum Rückgängigmachen von Vorgängen ausgeführt wurden.
quelle