19_8335_309-SQL-Transaktionen - Offene

Werbung
In diesem Abschnitt stehen Transaktionen im Mittelpunkt. Hierbei geht es darum,
wie bei Mehrbenutzerbetrieb die Integrität von Datenbanken gewährleistet wird.
1
Im einzelnen geht es in diesem Abschnitt um die Fragen
• Warum braucht man Transaktionen und was ist das Problem?
• Wie werden diese Probleme in der Praxis gelöst?
Hierbei werden wir auch noch weitere SQL Anweisungen kennenlernen.
2
Zunächst stellt sich die einfache Frage:
Warum reden wir über Transaktionen überhaupt?
Bisher haben wir uns keine Gedanken gemacht, was passieren könnte, wenn
mehrere Benutzer gleichzeitig auf Tabellen und deren Inhalte zugreifen.
Wir sind bisher bewusst oder unbewusst von folgenden Annahmen ausgegangen:
1. Wir sind die einzigen Benutzer auf der Datenbank
2. Wenn wir Tabellen oder Tabelleninhalte angelegt, geändert oder gelöscht
haben , wurden alle Änderungen sofort in der Datenbank gespeichert.
In der Praxis können wir nicht davon ausgehen, dass die 1. Annahme zu trifft.
Datenbanksystem wurde ja genau aus diesem Grunde entwickelt, damit viele
Benutzer gleichzeitig auf Daten zugreifen können.
Wenn nun mehrere Benutzer gleichzeitig auf Daten zugreifen mittels den
CRUD-Operationen und jeder Benutzer alle Änderungen „SOFORT“ in der
Datenbank wirksam werden, kann dies zu inkonsistenten Daten führen .
„SOFORT“ bedeute hier, nach der Ausführen einer einzelnen SQL-Anweisung
werden Änderungen sofort in der Datenbank persistent abgelegt.
3
Was hierbei das Problem ist schauen wir uns in der nächsten Abbildung anhand eines
kleinen Beispiels an.
`
3
Anhand eines kleinen Beispiels schauen wir uns an, wie es zu inkonsistenten
Daten kommen kann, wenn zwei Benutzer gleichzeitig auf Daten zugreifen und
dabei jede SQL-Anweisung unmittelbar in der Datenbank persistent gemacht
wird.
In der Abbildung sehen Sie, dass ein Benutzer eine Überweisung durchführen
möchte. Hierzu sind zwei Schritte notwendig.
Schritt 1) : Einen Betrag X von einem Konto des Kunden A abbuchen
Schritt 2) : Den Betrag X dem Konto von Kunde B gutschreiben
Abbuchen und Gutschreiben erfolgt also in zwei getrennten Schritten.
Aber was passiert, wenn bei dem zweiten Schritt (Gutschreiben) ein technischer
Fehler auftritt und das Gutschreiben des Betrages mit einem Fehler abgebrochen
wird?
Sicher kann man nun versuchen, die Abbuchung wieder rückgängig zu machen.
Aber was ist, wenn inzwischen ein anderer Benutzer den Kontostand von Kunde
A bereits gelesen hat?
4
Wie eine Lösung aussieht, sehen wir uns in der nächsten Abbildung an.
4
Das Stichwort für die Lösung des Problems lautet „Transaktion“.
Unter Transaktion versteht man das Gruppieren bzw. Zusammenfassen einer
Sequenz von SQL Anweisungen zu einer Gruppe.
Für diese Gruppe der Anweisung gilt folgende Regel.
Transaktionsregel:
Eine Transaktion ist eine atomare Einheit.
Entweder werden ALLE Anweisungen erfolgreich durchgeführt ODER es wurde
keine der Anweisungen durchgeführt.
Es gilt also das ALLES oder nichts Prinzip.
Siehe auch :
• Oracle 
https://docs.oracle.com/cd/B28359_01/server.111/b28318/transact.htm
Das Gruppieren von SQL Anweisungen kann man sich dabei vorstellen, wie die
Verwendung von Klammern in der Mathematik.
5
Wie wir noch sehen werden, gibt es für das Gruppieren der SQL Anweisungen eigene SQL
Befehle.
Schauen wir uns also als nächstes einige SQL Anweisung an, die für die Praxis am
wichtigsten sind.
5
Wenn Sie die Übungen mit der Datenbank H2 durchgeführt haben, haben Sie
immer im sogenannten Auto-Commit Mode gearbeitet.
Wie Sie in der Abbildung sehen, gibt es dort an der Benutzerschnittstelle im
Browser-Fenster eine Checkbox, in dem man den sogenannten Auto-Commit
Mode ein- und ausschalten kann.
In der Praxis arbeiten Datenbank-Anwendungsentwickler/innen meist mit einer
Kommando-Schnittstelle. In diesen Fall kann man über eine SQL-Anweisung
den autocommit-mode steuern.
Der entsprechende SQL Befehl lautet:
Set autocommit on
Bzw.
Set autocommit off
verwendet.
Ist der autocommit-mode eingeschaltet, so wird dies genauso, als würden sie
6
1. Eine Transaktion beginnen ( öffnende Klammer)
2. Eine SQL Anweisung durchführen
3. Eine Transaktion wieder beenden (schließende Klammer)
Hinweis:
Die meisten Datenbanksystem haben als Standardeinstellung den „autocommit-mode“
eingeschaltet/enabled.
vergleiche:
• MS SQL Server:  https://technet.microsoft.com/dede/library/ms187878(v=sql.105).aspx - Beim MS SQL Server lautet der Befehl: SET
IMPLICIT_TRANSACTIONS OFF bzw. SET IMPLICIT_TRANSACTIONS ON
• Oracle: 
http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12040.htm#i2698639
• H2:  http://www.h2database.com/html/grammar.html#set_autocommit
Nachdem wir nun wissen, wie man den autocommit-mode ausschalten, müssen wir uns als
nächstes ansehen, wie man mit SQL arbeitet, wenn der autocommit-mode ausgeschaltet
ist.
6
Nun kommen wir endlich zu den eigentlichen Transaktionen.
Ist der autocommit-mode ausgeschaltet, wird bei der Ausführung der ersten SQLAnweisung implizit/automatisch eine Transaktion gestartet ( geöffnete Klammer).
Soll eine Gruppe von Anweisungen als beendet betrachtet werden (geschlossene
Klammer), so kann man mittels der SQL-Anweisung .
Abweichung
commit;
eine Transaktion schließen.
Wird die SQL-Anweisung COMMIT ausgeführt, so zeigt die
Anwendung/Benutzer damit an, dass die Transaktion nun zu Ende ist und die
Änderungen in der Datenbank persistent hinterlegt werden können.
Als nächstes schauen wir uns nun einen Fehlerfall an.
7
Hinweis:
Oracle:  https://docs.oracle.com/database/121/CNCPT/transact.htm#CNCPT038
SQL Server:  https://msdn.microsoft.com/de-de/library/ms190295.aspx Beim MS SQL
Server lautet der Befehl: : commit Transaction;
H2:  http://www.h2database.com/html/grammar.html#commit
Weitere Besonderheiten:
Beim SQL-Server kann auch explizit mit „Begin Transaction“ eine Transaktion eingeleitet
werden . Siehe: https://msdn.microsoft.com/de-de/library/ms188929.aspx
7
Tritt nun während der Transaktion einen Fehler auf, oder ein Anwender möchte
eine Transaktion bewusst abbrechen, ist es notwendig Änderungen wieder
rückgängig zu machen.
Dies erfolgt mit der SQL-Anweisung
rollback;
Die SQL-Anweisung zeigt an, dass eine Transaktion zu Ende ist und alle
bisherigen Änderungen (seit dem Beginn der Transaktion) NICHT in der
Datenbank gespeichert werden dürfen.
TIPP:
Führen Sie nun die Übungen aus dem Übungsbuch zu dem Thema Transaktionen
durch.
8
Zum Abschluss machen wir uns nochmals den Sinn von Transaktionen klar.
Durch das ALLES oder NICHTS Prinzip der Transaktionen haben wir nun die
Möglichkeit, dass wir gewährleisten können, dass Daten immer konsistent sind.
Was das Transaktionskonzept insgesamt leistet, wird am besten durch das ACID
Akronym beschrieben. Was sich dahinter verbirgt, schauen wir uns als nächstes
an.
9
Transaktion sind also eine logische atomare Einheit und beinhaltet eine oder
mehrere SQL-Anweisungen.
Die Eigenschaften werden dabei durch das Akronym ACID beschrieben und steht
im einzelnen für
A – Atomicity  alle SQL Anweisungen werden korrekt ausgeführt oder gar
nicht
C – Consistency  alle Daten gehen von einem konsistenten Zustand in einen
anderen konsistenten Zustand über
I – Isolation  Die Änderungen innerhalb einer Transaktion sind erst dann für
andere sichtbar, wenn die Transaktion abgeschlossen ist.
D – Durability  Erst wenn am Ende einer Transaktion ein ‚commit‘ ausgeführt
wird, werden die Daten und deren Änderungen persistent / dauerhaft in der
Datenbank gespeichert.
Hinweis:
10
Dies bedeutet für die Praxis, dass wir uns bei dem Entwurf von Anwendungen immer über
folgende Punkte im klaren sein müssen:
• Steht ein SQL Anweisung für sich alleine oder steht sie in Verbindung mit anderen SQL
Anweisungen
• Ist eine Gruppierung notwendig, so sollte geprüft werden, ob wirklich alle Anweisung
in eine Gruppe gehören (minimale Gruppe).
10
11
12
13
Herunterladen