Denken Sie daran, dies ist eine komplizierte Frage, die zu klären ist, und wir werden möglicherweise einige Runden bearbeiten und kommentieren, um die Lücken zu schließen. Aufgrund der Art und Weise, wie Ihre Frage formuliert ist, unterscheiden Sie vermutlich nicht die Elemente Atomizität, Isolation, Konsistenz und Haltbarkeit von ACID.
Wenn eine Datenbank eine Transaktion startet, sind alle in dieser Transaktion ausgeführten Anweisungen isoliert und atomar (und konsistent und dauerhaft). Dies ist so ziemlich die Definition einer Transaktion.
Der Isolationsteil von ACID wird weitgehend missverstanden. Es gibt einen Grad, in dem Transaktionen voneinander isoliert sind, wie durch die Transaktionsisolationsstufe bestimmt. Die anderen Elemente von ACID sind absolut.
Wikipedia gibt an, dass es einige Datenbanken gibt, die sicherstellen, dass eine Transaktion isoliert bleibt, indem die Zeilen gesperrt und erst entsperrt werden, wenn die Transaktion festgeschrieben wurde.
Dies bezieht sich auf den Isolationsteil von ACID und hat keinen Einfluss auf Ihre Hauptfrage.
Meine Frage ist: Wie kann eine Datenbank, die ausschließlich auf Sperren beruht, Konsistenz garantieren? Wenn während der Transaktion ein Stromausfall auftritt, werden möglicherweise Daten teilweise in die Zeile geschrieben.
In Ihrem Beispiel geht es nicht um Konsistenz, sondern um Haltbarkeit und Atomizität. Diese werden durch Write Ahead Logging (WAL) garantiert . Bei WAL werden alle Änderungen in das Rückgängig- / Wiederherstellungsprotokoll geschrieben, bevor sie auf die Daten angewendet werden.
Im Falle eines Stromausfalls wird ein Wiederherstellungsprozess ausgeführt, der das Protokoll liest, um a) Transaktionen während des Flugs zu identifizieren, die nicht festgeschrieben wurden, und b) Transaktionen, die festgeschrieben wurden, aber nicht auf die Daten angewendet wurden. Die Änderungen von a) Transaktionen werden rückgängig gemacht (zurückgesetzt), wodurch die Daten in den Zustand vor der Transaktion zurückgesetzt werden. Die Änderungen von b) werden wiederholt (vorwärts gerollt), um sicherzustellen, dass sich die Daten im erwarteten Status nach der Transaktion befinden.
Was passiert selbst bei Datenbanken wie SQL Server, die eine temporäre Datenbank zum Ausführen aller Transaktionen verwenden, wenn ein Stromausfall auftritt, während die Datenbank die Transaktionen auf die Festplatte festschreibt?
TempDB (vorausgesetzt, Sie beziehen sich darauf) hat absolut nichts mit der Ausführung von Transaktionen durch SQL Server zu tun. Verwechseln Sie die Rolle von TempDB in Snapshot-Isolationsstufen?