1. Transaktionskonzept

Werbung
1. Transaktionskonzept
Ein wesentliches Charakteristikum für (relationale) Datenbanksysteme stellt die
Unterstützung des Transaktions-Konzepts dar. Transaktionen sind Verarbeitungseinheiten, die vom DBMS ganz oder gar nicht ausgeführt werden (unit of work).
Das Transaktionskonzept besagt, dass Fehlerzustände durch ein DBMS behandelt
werden können, indem der konsistente Zustand zu Beginn der Transaktion wiederhergestellt wird (unit of recovery). Schließlich besagt das Transaktionskonzept,
dass gleichzeitige Zugriffe mehrerer Benutzer auf gemeinsame Daten durch das
DBMS koordiniert werden müssen, so dass jeder Benutzer den Eindruck hat, als ob
er alleine auf die Daten zugreift (unit of concurrency).
Zur Charakterisierung von Transaktionen wird häufig die Wortschöpfung ACID
herangezogen.
A (atomic): Transaktionen sind atomar (=>unit of work)
C (consistent): Transaktionen sind konsistenzerhaltend, d.h., ein konsistenter Zustand der Daten wird durch eine Transaktion in einen konsistenten Zustand übergeführt (=> unit of work, unit of recovery).
I (isolated): Während einer Transaktion hat der Benutzer den Eindruck, er arbeite
alleine mit den Daten (=> unit of concurrency)
D (durable): Nach Ende einer Transaktion sind die in der Transaktion durchgeführten Änderungen in der Datenbank festgeschrieben (=> unit of recovery).
1.1
Transaktionen als Verarbeitungseinheiten
Das Transaktionskonzept wird in SQL standardmäßig so umgesetzt, dass eine
Transaktion automatisch beginnt, wenn außerhalb einer Transaktion eine SQLAnweisung ausgeführt wird. Die folgenden SQL-Anweisungen sind bis zum Transaktionende dieser Transaktion zugeordnet (“Multi Query Transaction”). Eine
Transaktion wird beendet mit der SQL-Anweisung
commit work
im Erfolgsfall (d.h., die Änderungen werden in der Datenbank festgeschrieben),
ansonsten mit
rollback work
(d.h., die Änderungen werden durch das DBMS zurückgesetzt). Einige Datenbanksysteme bieten die Möglichkeit, Transaktionen nochmals zu unterteilen, indem in
der Transaktionen savepoints gesetzt werden, bis zu denen ein Zurücksetzen der
Änderungen möglich ist:
rollback work to savepoint S
Die Tatsache, dass der Beginn einer Transaktion nicht explizit im Source Code einer Applikation zu sehen ist, kann als Mangel hinsichtlich der Dokumentation ge-
Transaktionskonzept
-2-
sehen werden. Daher ist zu überlegen, ob man im Rahmen einer Datenbankzugriffsschicht Funktionen zum Beginnen und Beenden von Transaktionen zur Verfügung stellt.
Einige SQL-Entwicklungsumgebungen bieten die Möglichkeit zu entscheiden, daß
man standardmäßig mit “Single Query Transactions” arbeiten will:
set autocommit on
In diesem Fall müssen Beginn und Ende einer Transaktion explizit codiert werden!
Für den Fall, dass bei der Bearbeitung einer SQL-Anweisung ein Fehler auftritt,
liegt es in der Verantwortlichkeit des Entwicklers, zu entscheiden, ob die Transaktion zurückgesetzt werden soll oder ein Wiederaufsetzen innerhalb der Transaktion
erfolgen soll. Mit Ausnahme weniger Situationen, die in den folgenden Abschnitten
beschrieben werden, gibt es keinen Automatismus seitens des DBMS.
Rollbacks sollten vermieden werden, da sie einen unnötigen Ressourcenverbrauch
mit sich bringen.
1.2
Transaktionen: unit of recovery
1.2.1
Rollback und Recovery im laufenden Betrieb
Wie oben beschrieben, ist es Aufgabe des DBMS, dafür zu sorgen, daß Transaktionen ganz oder gar nicht durchgeführt werden.
Dies bedeutet zunächst einmal:
•
Änderungen, die innerhalb von Transaktionen durchgeführt werden, die erfolglos beendet wurden oder erkennbar nicht beendet werden, müssen zurückgesetzt werden.
Um einen Rollback einer Transaktion durchzuführen, müssen die Änderungen, die
im Rahmen einer Transaktion durchgeführt werden, rückgängig gemacht werden.
Um dies zu bewerkstelligen, werden während der Ausführung der Transaktion folgende Daten Protokolliert:
Before Images (Zustand der Daten vor einer Änderung)
After Images (Zustand der Daten nach einer Änderung).
Die After Images werden im Transaction Log (Änderungsprotokoll) des DBMS
protokolliert. Je nach Implementierung werden die Before Images ebenfalls im
Transaction Log protokolliert oder in einem eigenen Bereich (teilweise auch zusätzlich!). Der Rollback wird entweder durchgeführt, indem die Änderungen in der
umgekehrten Reihenfolge der Ausführung zurückgesetzt werden oder indem die
Before Images wieder in die Datenbank zurückgeschrieben werden.
Das Datenbanksystem muß sicherstellen, dass ein notwendiger Rollback auch ausgeführt wird!
Datenbanken
Transaktionskonzept
1.2.2
-3-
Fast Recovery
Ohne Verwendung von Data Caching (die Blöcke, auf die häufig zugegriffen wird,
werden auch nach Änderungen in einem dedizierten Hauptspeicherbereich gehalten, verwaltet mittels eines LRU-Algorithmus) wäre beim erfolgreichen Ende einer
Transaktion eigentlich nichts zu tun, da sämtliche Änderungen bereits physisch in
der Datenbank stehen. Aus Effizienzgründen wird jedoch mit Data Caching gearbeitet, d.h., es werden geänderte Blöcke über das Transaktionsende hinaus im
Hauptspeicher gehalten (fast commit). Dies bedeutet, dass beim Verlust des
Hauptspeicherinhalt (Ausfall des DBMS oder des Betriebssystems) die Änderungen
im Rahmen der Transaktion verloren wären, was dem Transaktionskonzept widerspricht. Daher werden die Änderungen im Rahmen der Transaktion und das Commit in das Transaction Log geschrieben, und zwar spätestens zum Zeitpunkt des
Commit. (Auf den ersten Blick mag es widersinnig erscheinen, dass aus Effizienzgründen die geänderten Seiten im Cache gehalten werden, auf der anderen Seite
aber zusätzlicher Aufwand durch das Protokollieren der Änderungen entsteht. Dies
ist jedoch so nicht richtig, da
•
Die After Images für die Media Recovery benötigt wird
•
Das Schreiben ins Transaction Log effizienter ist
Die zweite Aussage ist darin begründet, dass das Schreiben ins Transaction Log
sequentiell erfolgt und das zu schreibende Volumen wesentlich geringer ist. Ferner
wird die Effizienz des Schreibens ins Transaction Log noch gesteigert durch das
group commit – Verfahren, das dafür sorgt, dass mehrere Transaktionen mit einem
Zugriff auf das Transaction Log abgeschlossen werden können.)
Für den Fall eines Hauptspeicherverlusts muß das DBMS neu gestartet werden. Als
erste (automatische) Aktion im Rahmen des Restarts muß die Bereinigung der Änderungen im Rahmen von Transaktionen durchgeführt werden, die zum Zeitpunkt
des Systemausfalls aus Sicht des DBMS noch nicht endgültig abgeschlossen waren
(crash recovery). (Dies betrifft auch die bestätigten Transaktionen, für die noch
nicht gesichert ist, dass alle Änderungen schon in der Datenbank stehen!)
•
Es ist von einem stabilen Aufsetzpunkt auszugehen.
•
Für danach erfolgreich abgeschlossene Transaktionen müssen sämtliche
Änderungen ab diesem Punkt in der Datenbank festgeschrieben werden (redo recovery).
•
Für zu diesem Zeitpunkt offene oder danach begonnene Transaktionen, die
nicht erfolgreich abgeschlossen wurden, müssen sämtliche Änderungen zurückgesetzt werden (falls Blöcke, die von Änderungen betroffen wurden,
aus dem Cache ausgelagert wurden) (undo recovery).
Datenbanken
Transaktionskonzept
1.2.3
-4-
Checkpoints
Basis des oben genannten Verfahrens zur Crash Recovery ist ein stabiler Aufsetzpunkt, zu dem man weiß, dass der Zustand der Datenbank korrekt ist, d.h., mit dem
Zustand des Data Cache übereinstimmt.
Derartige Punkte werden als Checkpoints bezeichnet. Wenn ein Checkpoint
durchgeführt wird, werden sämtliche modifizierten Blöcke im Cache in die Datenbank zurückgeschrieben, für die sich dies als notwendig erweist. Checkpoints müssen regelmäßig durchgeführt werden, damit sich die Zeit für eine eventuell notwendige Crash Recovery in Grenzen hält.
Da während der Durchführung eines Checkpoints der “normale” Datenbankbetrieb
behindert wird, wird im Rahmen der Implementierung eines DBMS der Versuch
unternommen, Checkpoints so kurz wie möglich zu gestalten. Daher werden zwischen den Checkpoints asynchron modifizierte Blöcke aus dem Cache in die Datenbank geschrieben.
Die Implementierung der Checkpoints und des asynchronen Rückschreibens von
modifizierten Blöcken zwischen den Checkpoints ist von DBMS zu DBMS verschieden. Für sämtliche DBMS besteht hier relevantes Tuningpotential.
1.2.4
Lange Transaktionen
Das Transaction Log hat eine vorgegebene Größe, die zur Laufzeit nur für einige
DBMS modifiziert werden kann, und auch dies nur bedingt. Daher sollte man davon ausgehen, daß das Transaction Log nur eine gewisse Menge von Änderungsinformation aufnehmen kann, d.h., Bereiche, die nicht mehr für Rollbacks und ein
eventuell notwendiges Crash Recovery-Verfahren benötigt werden, müssen zum
Überschreiben freigegeben werden. Die Implementierung dieser Freigabe ist prinzipiell die gleiche, obwohl im Detail Unterschiede von DBMS zu DBMS bestehen.
Wir können uns das Transaction Log vorstellen als einen Ringpuffer, der in N gleiche Abschnitte unterteilt ist. Wird ein Checkpoint durchgeführt, so wird festgestellt, bis zu welchem Abschnitt zurück noch Änderungsinformationen zu offenen
Transaktionen stehen. Diese Abschnitte werden noch für eine evt. notwendige undo
recovery benötigt, falls der Rollback via Transaction Log durchgeführt wird, die
Abschnitte davor können freigegeben werden.
Die regelmäßige Freigabe von Abschnitten ist grundlegende Voraussetzung für
eine funktionierende Verwaltung des Transaction Log durch das DBS. Sie wird wie
oben angesprochen behindert durch lange Transaktionen (Länge= Differenz der
aktuellen Position im Transaction Log zum ersten Eintrag zu der Transaktion).
Lange Transaktionen können im Extremfall dazu führen, daß das DBMS neu gestartet werden muß!
Aus den o.g. Ausführungen ist abzuleiten, dass die Konfiguration des Transaction
Log zwischen der Datenbankadministration und der Anwendungsentwicklung abgesprochen werden muß. Aus Sicht der Anwendungsentwicklung ist die Zielsetzung zu verfolgen, Transaktionen so kurz wie möglich zu konzipieren. Aus Sicht
Datenbanken
Transaktionskonzept
-5-
der Datenbankadministration ist sicherzustellen, dass das Transaction Log (und ggf.
Bereiche, in denen Before Images verwaltet werden) hinreichend groß konfiguriert
werden.
1.2.5
Media Recovery
In Abschnitt 3.2.2 wurde die Rolle des Transaktionskonzepts für Fast Recovery
diskutiert, d.h., die automatische Recovery durch das DBMS nach einem Hauptspeicherverlust im Rahmen des folgenden Restarts.
In diesem Abschnitt soll die Situation betrachtet werden, dass ein Fehler in der Datenbank selbst auftritt. Ursache eines solchen Fehlers können sein:
•
Medienfehler
•
Physische Fehler in der Datenbank (Block Corruption)
•
Logische Fehler, die durch Anwendungen oder Datenbankadministration
verursacht werden
Die erste Fehlersituation, die früher der typische Fall für die Notwendigkeit einer
Media Recovery war (daher der Name!), lässt sich aus heutiger Sicht weitestgehend durch den Einsatz von Redundanz vermeiden (Einsatz von RAID-Systemen).
Falls diese Fehlersituation auftritt, muß jedoch eine Media Recovery erfolgen: Der
Zustand der Datenbank zum Zeitpunkt des Fehlers muß wiederhergestellt werden.
Falls physische Fehler in der Datenbank auftreten, gibt es prinzipiell die Möglichkeit des Patchens, die aber nicht immer greift. Dann muß eine Media Recovery erfolgen.
An dieser Stelle ist zu bemerken, dass man Fehlern auf der physischen Ebene dadurch begegnen kann, dass Redundanz auf einer höheren Ebene aufgebaut wird,
z.B. durch den Einsatz von Replikationsverfahren. Die Erfahrung zeigt, dass derartige Maßnahmen eine beachtliche Erfolgsquote haben, die aber nicht bei 100%
liegt. Daher lässt sich die Notwendigkeit einer Media Recovery nicht ausschließen.
Falls logische Fehler auftreten, ist eine Media Recovery im oben genannten Sinn
nicht ausreichend, da der Zustand der Datenbank zum Zeitpunkt der Fehlererkennung fehlerhaft ist. Hier müssen weitergehende Verfahren wie Point in Time – Recovery angewandt werden, d.h., man muß spezifizieren können, bis zu welcher
Transaktion bzw. zu welchem Zeitpunkt der Recoveryvorgang durchgeführt werden
soll.
1.2.5.1 Vorbereitungen für Media Recovery
Um eine Media Recovery durchführen zu können, müssen folgende Voraussetzungen erfüllt sein:
•
Es muß einen stabiler Aufsatzpunkt für die Recovery Maßnahme geben, eine Datensicherung. Die Datensicherung muß regelmäßig durchgeführt werden.
Datenbanken
Transaktionskonzept
•
Es müssen alle Änderungen seit der letzten Datensicherung vorliegen.
•
Datensicherung und Änderungsprotokoll müssen kompatibel sein.
-6-
Die Datensicherungsmaßnahmen können unterteilt werden in
•
Offline – Sicherungen
•
Online – Sicherungen.
Aus Gründen der Verfügbarkeit des Systems sind Online-Sicherungen vorzuziehen,
es ist jedoch zu beachten, dass der “normale” Datenbankbetrieb durch eine OnlineSicherung behindert wird.
Ferner ist zu unterscheiden zwischen
•
Sicherung durch Datenexport
•
Sicherungen auf Betriebssystemebene
•
Sicherung mit Mitteln des DBMS
Sicherungen durch Datenexport und Sicherungen auf Betriebssystemebene, die
nicht in Sicherungsverfahren des DBMS integriert sind, sind i.a. nur offline möglich und nicht kompatibel mit dem Änderungsprotokoll, d.h., es ist nur der Zustand
zum Zeitpunkt der Sicherung rekonstruierbar.
Liegt eine Sicherung mit Mitteln des DBMS vor, so bildet diese einen Ausgangspunkt für Media Recovery.
Dazu müssen sämtliche Änderungen seit der letzten Datensicherung vorliegen. Da
das Transaction Log nicht beliebig wachsen kann, müssen die Abschnitte des Transaction Log, die für eventuell notwendige Fast Recovery Maßnahmen nicht mehr
benötigt werden, archiviert werden. Die Voraussetzungen für diese Archivierung
müssen von der Datenbankadministration explizit geschaffen werden, standardmäßig arbeitet ein DBMS ohne Archivierung.
1.2.5.2 Durchführung der Media Recovery
Sind die Voraussetzungen für die Media Recovery gegeben, so kann diese durchgeführt werden, indem
•
die Sicherung eingespielt wird
•
die Änderungen seit der letzten Sicherung nachgefahren werden
Die Zeit für das Einspielen der Sicherung kann durch hinreichend kleine Sicherungseinheiten sowie Parallelität häufig stark reduziert werden. Das Nachfahren der
Änderungen seit der letzten Sicherung ist dagegen abhängig vom Änderungsaufkommen und daher häufig entscheidend für die Dauer der Recoverymaßnahme.
Sowohl die Sicherungseinheiten als auch das Sicherungsintervall sollten so gewählt
werden, dass die Anforderungen, die an Recoveryzeiten gestellt werden, erfüllt
werden können.
Datenbanken
Transaktionskonzept
1.2.6
-7-
Verfügbarkeit eines DBMS
Bei der Einrichtung von IT-Systemen mit Datenbankunterstützung findet man immer häufiger folgende Anforderungen vor:
•
Verfügbarkeit rund um die Uhr
•
Verwaltung sehr großer Datenmengen (VLDB: Very Large Data Base)
In dieser Umgebung ist es notwendig, Maßnahmen zur Steigerung der Verfügbarkeit (im wesentlichen Redundanz durch RAID-Systeme, externe Speichersubsysteme, Cluster, Replikation) zu kombinieren mit evt. notwendigen Recovery Maßnahmen oder sonstigen administrativen Maßnahmen.
Es werden immer häufiger Techniken eingesetzt, durch redundante Datenhaltung
Recovery-Maßnahmen zu vermeiden oder administrative Maßnahmen (z.B. Backup) auf einer (aus einem synchronen Zustand abgekoppelten) Kopie der Daten
durchzuführen, die dann wieder mit dem operativen Bestand synchronisiert werden.
Man sollte jedoch beachten, dass diese Maßnahmen zwar hilfreich sind, um administrative Maßnahmen abseits vom laufenden Datenbankbetrieb durchführen zu
können und physischen Fehlersituationen zu begegnen, aber bei logischen Fehlern
nicht ohne weitere Vorkehrungen eingesetzt werden können.
1.3
Transaktionen: unit of concurrency
Eine wesentliche Zielsetzung des Transaktionskonzepts besteht darin, dass der
Zugriff mehrerer Benutzer auf gemeinsame Daten durch das DBMS koordiniert
werden kann.
Findet eine derartige Koordination nicht statt, so können mehrere Phänomene auftreten, die i.a. nicht erwünscht sind:
•
Lost Update
•
Uncommitted Read
•
Non Repeatable Read
•
Phantom Bildung
Unter ”Lost Update” versteht man die Situation, daß zwei Benutzer die gleichen
Daten lesen und dann Änderungen an den Daten vornehmen. Ohne Koordination
durch das DBMS wird die erste Änderung durch die zweite überschrieben, unabhängig davon, ob Abhängigkeiten bestehen oder nicht.
Unter “Uncommitted Read” versteht man die Situation, dass ein Benutzer Auswertungen auf Daten durchführt, für die gerade eine Änderung ausgeführt wurde, die
jedoch zurückgerollt wird. Unter “Non Repeatable Read” versteht man die Situation, dass die gleiche Abfrage unterschiedliche Werte für die gleichen Datensätze
liefert, unter “Phantombildung”, dass die gleiche Abfrage zu unterschiedlichen Ergebnissen führt (durch neue oder gelöschte Einträge).
Datenbanken
Transaktionskonzept
-8-
Lost Updates sollten in jedem Fall vermieden werden, die übrigen Phänomene werden z.T. als akzeptabel betrachtet, da sie nur das Lesen betreffen.
1.3.1
Sperren zur Koordination des konkurrierenden Zugriffs
Um die o.g. Phänomene zu vermeiden, arbeiten Datenbanksysteme mit Sperren. Es
gibt mehrere Typen von Sperren, für ändernde Zugriffe werden exklusive Sperren
(X locks) verwendet, die nicht mit anderen X locks auf gleiche Daten verträglich
sind, bis zum Transaktionsende bestehen bleiben und auch sonst nicht konfigurierbar sind (bis auf das Sperr Granulat und die Reaktion auf Nichtgewähren der Sperre
– Warten oder Fehler, ggf. nach Timeout). Für lesende Zugriffe werden (gemäß
SQL 3) standardmäßig S (shared) locks eingesetzt, die mit anderen S locks auf
gleiche Daten verträglich sind, aber nicht mit X locks. S locks sind konfigurierbar!
Verträglichkeit
S lock
X lock
S lock
Ja
Nein
X lock
Nein
Nein
Unter Verwendung von Sperren werden Lost Updates vermieden:
Wenn Benutzer 1 Daten liest, benötigt er hierzu einen S lock, den er auch erhält.
Gleiches gilt für Benutzer 2. Wenn jetzt einer der Benutzer Daten ändern will, so
benötigt er hierzu einen X lock, den er aber nicht erhält, weil er mit dem S lock des
jeweils anderen Benutzers nicht verträglich ist.
Dies bedeutet, dass der Lost Update verhindert wird, aber um den Preis, dass beide
nicht weiterarbeiten können, weil sie jeweils auf den anderen warten. Diese Situation wird als Deadlock bezeichnet. Eine Deadlock Situation kann nicht von einem
der Benutzer aufgelöst werden, sondern nur durch das DBMS, das eine der beteiligten Transaktionen als “Opfer” bestimmt und i.a. diese Transaktion zurückrollt, wodurch die Sperren freigegeben werden und die andere Transaktion fortfahren kann.
1.3.2
Vermeidung von Deadlock Situationen
Deadlock Situationen sind unerwünscht, weil der Rollback durch das DBMS (oder
die Applikation) unnötig Ressourcen verbraucht. Daher sollte es Ziel der Applikationsentwicklung, speziell der Entwicklung von Datenbank Zugriffsschichten sein,
Deadlock Situationen zu vermeiden.
Um Strategien zur Deadlock Vermeidung zu erarbeiten, muß man zunächst analysieren, aufgrund welcher Zugriffsmuster Deadlocks entstehen. Es zeigt sich, dass
vor allem die folgenden Zugriffsmuster Deadlocks provozieren:
•
Read for Update
•
Lock Eskalation
•
Inkonsistente Änderungspfade
Datenbanken
Transaktionskonzept
-9-
1.3.2.1 Read for Update
“Read for Update” ist die oben diskutierte Situation, dass Daten gelesen werden mit
der Zielsetzung, anschließend Änderungen an den Daten vorzunehmen. Dies führt
dazu, dass bei parallelem Zugriff ein Deadlock entsteht.
Um “Read for Update” Situationen in den Griff zu bekommen, gibt es mehrere
Möglichkeiten:
•
Lesende Zugriffe ohne Sperren
•
Lesen und Schreiben werden nicht in der gleichen Transaktion durchgeführt.
•
“Read for Update” – Zugriffe mit stärkeren Sperren
•
Änderung der Anweisungsreihenfolge
Der SQL Standard sieht die Möglichkeit vor, Transaktionen bezüglich der Verwendung von Lese Sperren zu konfigurieren, indem man ein isolation level setzt. Es
werden im SQL Standard folgende isolation level vorgesehen:
•
Read uncommitted: Es werden weder Sperren gesetzt noch beachtet
•
Read committed: Es werden keine Sperren gesetzt, aber nur bestätigte Daten gelesen
•
Repeatable Read: Lese Sperren werden gesetzt und bis zum Ende der
Transaktion gehalten.
•
Serializable: Es findet keine Phantombildung statt.
(Die Tatsache, dass es diese isolation level gibt, zeigt, dass “Uncommited Read”,
“Non Repeatable Read” und Phantombildung durchaus als akzeptabel angesehen
werden!)
Darüber hinaus bieten einige DBS das isolation level cursor stability an, falls mit
einem cursor gearbeitet wird: Beim fetch wird eine Sperre auf die Zeile gesetzt, die
Sperre wird beim nächsten fetch zurückgenommen.
Eine weitere Möglichkeit, Lese Sperren zu konfigurieren, besteht in der Verwendung von update (U) locks. Die Verträglichkeitsmatrix sieht dabei folgendermaßen
aus:
Verträglichkeit
S lock
U lock
X lock
S lock
Ja
Ja
Nein
U lock
Ja
Nein
Nein
X lock
Nein
Nein
Nein
Datenbanken
Transaktionskonzept
- 10 -
Durch Verwendung von U locks für „Read for Update“ – Zugriffe (Pessimistisches
Locking) wird der Zugriff serialisiert. Damit werden Lost Updates und Deadlocks
vermieden, aber Wartezustände erzeugt, die der Benutzer beeinflusst, oder Fehler
wegen Nichtgewährung des U Locks beim Lesen.
Ein anderes Verfahren zur Behandlung von „Read for Update“ – Zugriffen ist das
optimistische Locking, das davon ausgeht, dass Konflikte selten auftreten werden
und in der Applikation behandelt werden können. Verwendet man die isolation
level read uncommitted bzw. read committed, so werden beim Lesen keine Sperren
gesetzt, und es gibt keine Konflikte zwischen Lese Sperren und X locks. (Dies gilt
ebenfalls, wenn Lesen und Ändern der Daten in unterschiedlichen Transaktionen
stattfinden.) Es besteht jedoch die Möglichkeit, dass zwischen dem Zeitpunkt des
Lesens und dem Zeitpunkt der Änderung die Daten geändert wurden. Dies ist in der
Datenzugriffsschicht zu behandeln, z.B. dadurch, dass vor dem Update ein erneutes
Lesen der Daten stattfindet (mit U Lock zur Deadlockvermeidung!) und überprüft
wird, ob eine Änderung stattgefunden hat, verbunden mit einer Wiedervorlage in
diesem Fall. Dieses Verfahren funktioniert sehr gut, falls wenig Konflikte auftreten,
ist aber sehr problematisch, wenn viele Wiedervorlagen auftreten.
Es soll an dieser Stelle noch darauf, hingeweiesen werden, dass es in einigen Fällen
die Möglichkeit gibt, lesende und schreibende Zugriffe zu vertauschen (mit entsprechender Anpassung) oder zusammenzufassen (z.B. bei Vergabe eines surrogate
key durch eine Datenbank Zugriffsschicht oder bei der o.g. Überprüfung im Rahmen des optimistischen Locking).
1.3.2.2 Lock Eskalation
“Lock Eskalation” ist eine Situation, die darauf basiert, dass es unterschiedliche
Sperr Granulate gibt:
•
Datenbank
•
Tabelle (Partition, Index)
•
Block
•
Zeile
Da jede Sperre Ressourcen benötigt und diese Ressourcen beschränkt sind, kann
ein DBMS auf das Erreichen einer Grenze entweder mit einer Exception reagieren
(z.B. Informix) oder mit einer Vergabe eines Locks für die nächst gröbere Ebene
(z.B. DB2). Dies bezeichnet man als Lock Eskalation. Nehmen 2 Benutzer Änderungen in einer Tabelle vor, so führt dies zunächst nicht zu einem Konflikt, findet
Lock Eskalation statt, so kann keiner den X lock auf die Tabelle erhalten, weil jeweils der andere Teile der Tabelle exklusiv gesperrt hat. Folglich liegt eine Deadlock Situation vor.
Um die hier genannten Situationen zu vermeiden, ist zu überlegen, ob man die
Zugriffe auf die Tabelle serialisiert, in dem man von Beginn an mit einer exklusi-
Datenbanken
Transaktionskonzept
- 11 -
ven Sperre auf Tabellenebene arbeitet. Diese kann explizit in der Applikation gesetzt werden:
lock table Tabellenname in [share / exclusive] mode
1.3.2.3 Inkonsistente Änderungspfade
Die gleichen Überlegungen wie für Lock Eskalation gelten für inkonsistente
Zugriffspfade bei Änderungen: Auch hier besteht die Möglichkeiten, dass ändernde
Transaktionen zunächst konfliktfrei arbeiten, aber später auf gemeinsame Daten
zugreifen und damit jeweils auf den anderen warten müssen, so dass wiederum eine
Deadlocksituation vorliegt.
Die Serialisierung der Zugriffe wie im Fall der Lock Eskalation kann hier eingesetzt werden. Auf der anderen Seite ist zu beachten, dass durch zentral koordinierte,
konsistente Zugriffspfade sowohl die Zielsetzung “Vermeidung von Deadlocks” als
auch die Zielsetzung “Steigerung des Duchsatzes” unterstützt wird.
1.3.3
Vermeidung von Lock Wait Situationen
Die wesentliche Zielsetzung bei der Verwaltung konkurrierender Zugriffe auf eine
Datenbasis ist es, einen hohen Durchsatz zu erreichen, indem das Warten auf die
Gewährung von Sperren minimiert wird.
Das lange Warten auf eine Sperre wird vom Anwender eines Systems oft sogar
negativer empfunden als eine Fehlersituation, wie sie im Fall des Deadlock auftritt.
Daher bieten Datenbanksysteme i.a. die Möglichkeit der Konfiguration, wie lange
auf eine Sperre gewartet werden soll. Derartige Spezifikationsmöglichkeiten bestehen i.a. zu Beginn einer Transaktion, aber auch im Kontext einzelner SQLAnweisungen wie “lock table”.
Führt eine derartige Maßnahme zu einer Fehlersituation, so ist es Aufgabe der Datenzugriffsschicht, auf den Fehler zu reagieren und z.B. die Transaktion zurückzurollen. Diese Reaktion bedeutet jedoch wieder eine Verschwendung von Ressourcen, so dass zu untersuchen ist, wie die Wartesituation an sich vermieden wird.
Hierzu kann man folgende Prinzipien anwenden:
•
Verwendung kurzer Transaktionen (KISS: keep it simple and short)
•
Keine Benutzerinteraktion in Transaktionen
•
Verwendung kleiner Sperrgranulate durch effiziente Zugriffspfade
•
Verzicht auf Lese Sperren
1.3.4
Sperren von Objekten auf Applikationsebene
Es gibt Situationen, in denen Datenbanksperren nicht das geeignete Instrument
sind, um den konkurrierenden Zugriff auf gemeinsam benutzte Daten zu koordinieren. Dies ist etwa zu berücksichtigen, wenn eine Koordination des Zugriffs über
Datenbanksperren zu komplex und / oder zu ineffizient ist oder Sperren länger
Datenbanken
- 12 -
gehalten werden müssen als für die Dauer einer Datenbank Connection und semantisch Objekte identifiziert werden können, auf die die Konkurrenzsituation beim
Zugriff reduziert werden kann. In diesem Fall wird häufig die Technik angewandt,
ein explizites Check Out - und Check In - Verfahren für diese Objekte zu implementieren. Dies kann über die Datenbank erfolgen, etwa durch Verwaltung der Objekte in einer Tabelle, in der nicht nur das Check Out / Check In dokumentiert ist,
sondern der Zustand des Objekts.
Es ist zu beachten, dass bei derartigen Verfahren sichergestellt werden muß, dass
der Zugriff auf die Objekte nur über die Applikation erfolgt und verhindert werden
muß, dass Objekte gesperrt bleiben, weil der für die Freigabe einer Sperre explizit
notwendige Check In nicht stattgefunden hat.
Datenbanken
Herunterladen