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