Wie brb tea sagt, hängt dies von der Datenbankimplementierung und dem verwendeten Algorithmus ab: MVCC oder Two Phase Locking.
CUBRID (Open Source RDBMS) erklärt die Idee dieser beiden Algorithmen:
- Zweiphasenverriegelung (2PL)
Der erste ist, wenn die T2-Transaktion versucht, den A-Datensatz zu ändern, sie weiß, dass die T1-Transaktion den A-Datensatz bereits geändert hat, und wartet, bis die T1-Transaktion abgeschlossen ist, da die T2-Transaktion nicht wissen kann, ob die T1-Transaktion festgeschrieben oder gerollt wird zurück. Diese Methode wird als Zwei-Phasen-Verriegelung (2PL) bezeichnet.
- Parallelitätskontrolle für mehrere Versionen (MVCC)
Die andere besteht darin, jeder von ihnen, T1- und T2-Transaktionen, zu erlauben, ihre eigenen geänderten Versionen zu haben. Selbst wenn die T1-Transaktion den A-Datensatz von 1 auf 2 geändert hat, lässt die T1-Transaktion den ursprünglichen Wert 1 unverändert und schreibt, dass die T1-Transaktionsversion des A-Datensatzes 2 ist. Dann ändert die folgende T2-Transaktion den A-Datensatz von 1 bis 3, nicht von 2 bis 4, und schreibt, dass die T2-Transaktionsversion des A-Datensatzes 3 ist.
Wenn die T1-Transaktion zurückgesetzt wird, spielt es keine Rolle, ob die 2, die T1-Transaktionsversion, nicht auf den A-Datensatz angewendet wird. Wenn danach die T2-Transaktion festgeschrieben wird, wird die 3, die T2-Transaktionsversion, auf den A-Datensatz angewendet. Wenn die T1-Transaktion vor der T2-Transaktion festgeschrieben wird, wird der A-Datensatz zum Zeitpunkt der Festschreibung der T2-Transaktion in 2 und dann in 3 geändert. Der endgültige Datenbankstatus ist identisch mit dem Status der unabhängigen Ausführung jeder Transaktion, ohne dass dies Auswirkungen auf andere Transaktionen hat. Daher erfüllt es die ACID-Eigenschaft. Diese Methode wird als MVCC (Multi-Version Concurrency Control) bezeichnet.
Das MVCC ermöglicht gleichzeitige Änderungen auf Kosten eines erhöhten Speicheraufwands (da unterschiedliche Versionen derselben Daten verwaltet werden müssen) und einer Berechnung (auf der Ebene REPETEABLE_READ können Sie keine Updates verlieren, sodass die Versionen der Daten wie Hiberate überprüft werden müssen macht mit Optimistick Locking ).
In 2PL Transaktionsisolationsstufen steuern Sie Folgendes :
Ob beim Lesen von Daten Sperren genommen werden und welche Art von Sperren angefordert werden.
Wie lange die Lesesperren gehalten werden.
Ob eine Leseoperation, die auf Zeilen verweist, die von einer anderen Transaktion geändert wurden:
Blockieren, bis die exklusive Sperre für die Zeile freigegeben ist.
Rufen Sie die festgeschriebene Version der Zeile ab, die zum Zeitpunkt des Starts der Anweisung oder Transaktion vorhanden war.
Lesen Sie die nicht festgeschriebene Datenänderung.
Die Auswahl einer Transaktionsisolationsstufe wirkt sich nicht auf die Sperren aus, die zum Schutz von Datenänderungen erworben wurden. Eine Transaktion erhält immer eine exklusive Sperre für alle Daten, die sie ändert, und hält diese Sperre, bis die Transaktion abgeschlossen ist, unabhängig von der für diese Transaktion festgelegten Isolationsstufe. Bei Lesevorgängen definieren Transaktionsisolationsstufen in erster Linie die Schutzstufe vor den Auswirkungen von Änderungen, die durch andere Transaktionen vorgenommen werden.
Eine niedrigere Isolationsstufe erhöht die Fähigkeit vieler Benutzer, gleichzeitig auf Daten zuzugreifen, erhöht jedoch die Anzahl der Parallelitätseffekte , wie z. B. Dirty Reads oder verlorene Updates, auf die Benutzer möglicherweise stoßen.
Konkrete Beispiele für die Beziehung zwischen Sperren und Isolationsstufen in SQL Server (verwenden Sie 2PL außer bei READ_COMMITED mit READ_COMMITTED_SNAPSHOT = ON).
READ_UNCOMMITED: Geben Sie keine gemeinsam genutzten Sperren aus, um zu verhindern, dass andere Transaktionen die von der aktuellen Transaktion gelesenen Daten ändern. READ UNCOMMITTED-Transaktionen werden auch nicht durch exklusive Sperren blockiert, die verhindern würden, dass die aktuelle Transaktion Zeilen liest, die geändert, aber nicht von anderen Transaktionen festgeschrieben wurden. [...]
READ_COMMITED:
- Wenn READ_COMMITTED_SNAPSHOT auf OFF gesetzt ist (Standardeinstellung): Verwendet gemeinsam genutzte Sperren, um zu verhindern, dass andere Transaktionen Zeilen ändern, während die aktuelle Transaktion einen Lesevorgang ausführt. Die gemeinsam genutzten Sperren blockieren auch das Lesen von Zeilen, die von anderen Transaktionen geändert wurden, bis die andere Transaktion abgeschlossen ist. [...] Zeilensperren werden aufgehoben, bevor die nächste Zeile verarbeitet wird. [...]
- Wenn READ_COMMITTED_SNAPSHOT auf ON gesetzt ist, verwendet das Datenbankmodul die Zeilenversionierung, um jeder Anweisung einen transaktionskonsistenten Snapshot der Daten zu präsentieren, wie sie zu Beginn der Anweisung vorhanden waren. Sperren werden nicht verwendet, um die Daten vor Aktualisierungen durch andere Transaktionen zu schützen.
REPETEABLE_READ: Gemeinsame Sperren für alle Daten, die von jeder Anweisung in der Transaktion gelesen werden, werden gehalten, bis die Transaktion abgeschlossen ist.
SERIALIZABLE: Bereichssperren werden in den Bereich der Schlüsselwerte eingefügt, die den Suchbedingungen jeder in einer Transaktion ausgeführten Anweisung entsprechen. [...] Die Bereichssperren werden gehalten, bis die Transaktion abgeschlossen ist.