Aufgabe 01 - Transaktionen und ACID (Bankfiliale)
Aufgabe 01 - Transaktionen und ACID (Bankfiliale)
Abschnitt betitelt „Aufgabe 01 - Transaktionen und ACID (Bankfiliale)“Worum geht es?
Abschnitt betitelt „Worum geht es?“In dieser Übung werden Transaktionen von Hand gesteuert und das ACID-Prinzip praktisch nachvollzogen (siehe Kapitel 1 - Transaktionen und Parallelität). Als durchgehendes Beispiel dienen Konten einer Bankfiliale, auf denen Geld gebucht und zwischen denen überwiesen wird. Im Expertenteil wird mit zwei gleichzeitig geöffneten Sitzungen ein Lost Update erzeugt und wieder verhindert.
Was Sie dafür brauchen
Abschnitt betitelt „Was Sie dafür brauchen“- Kapitel 1 - Transaktionen und Parallelität, Abschnitte ACID und Fehlerklassen.
- Ein PostgreSQL-Server und ein SQL-Editor, mit dem sich zwei Sitzungen gleichzeitig öffnen lassen (zwei Fenster oder zwei
psql-Terminals).
Welche Kompetenzen Sie erwerben und zeigen
Abschnitt betitelt „Welche Kompetenzen Sie erwerben und zeigen“- Sie klammern Anweisungen mit
BEGIN,COMMITundROLLBACKzu einer Transaktion. - Sie erklären die vier ACID-Eigenschaften an konkreten Beispielen.
- Sie führen eine Überweisung als atomare Einheit aus und machen sie mit
ROLLBACKrückgängig. - Sie provozieren ein Lost Update mit zwei Sitzungen und verhindern es mit einer Sperre.
Pädagogische Einordnung
Abschnitt betitelt „Pädagogische Einordnung“- Reproduktion: Transaktionen starten, bestätigen und zurückrollen (Teil A).
- Reorganisation und Transfer: eine Überweisung als atomare Einheit umsetzen (Teile B und C).
- Reflexion, Problemlösung und Urteilsbildung: ein Lost Update erzeugen, erklären und verhindern (Teil D).
Arbeitsaufträge
Abschnitt betitelt „Arbeitsaufträge“Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.
Schema und Testdaten
Abschnitt betitelt „Schema und Testdaten“CREATE TABLE konten ( konto_id INT PRIMARY KEY, inhaber VARCHAR(50), saldo NUMERIC(10,2) NOT NULL CHECK (saldo >= 0));
INSERT INTO konten VALUES(1, 'Andrea Hofer', 1000.00),(2, 'Bernd Gruber', 500.00),(3, 'Clara Steiner', 0.00);Teil A - Transaktionen steuern
Abschnitt betitelt „Teil A - Transaktionen steuern“- Starten Sie eine Transaktion, erhöhen Sie den Saldo von Konto 1 um 200 und beenden Sie mit
ROLLBACK. Prüfen Sie danach den Saldo und erklären Sie das Ergebnis. - Wiederholen Sie dieselbe Buchung, diesmal mit
COMMIT. Prüfen Sie erneut den Saldo. - Erklären Sie in je einem Satz, wofür
BEGIN,COMMITundROLLBACKstehen.
Teil B - Eine Überweisung als atomare Einheit
Abschnitt betitelt „Teil B - Eine Überweisung als atomare Einheit“- Überweisen Sie in einer Transaktion 300 von Konto 1 auf Konto 2 (zwei
UPDATE, dannCOMMIT). - Zeigen Sie, dass zwischen den beiden
UPDATE-Anweisungen die Summe aller Salden kurzzeitig „falsch” wäre, wenn ein anderer die Daten sehen könnte, und begründen Sie, warum genau deshalb beide Buchungen zusammengehören.
Teil C - Konsistenz und der Abbruch
Abschnitt betitelt „Teil C - Konsistenz und der Abbruch“- Versuchen Sie in einer Transaktion, 5000 von Konto 3 (Saldo 0) abzubuchen. Was passiert wegen der
CHECK-Bedingung? - Erklären Sie am Ergebnis das A (Atomarität) und das C (Konsistenz) aus ACID: Warum bleibt die Datenbank auch nach dem gescheiterten Abbruch in einem gültigen Zustand?
Teil D - Expertenteil: Ein Lost Update provozieren und verhindern
Abschnitt betitelt „Teil D - Expertenteil: Ein Lost Update provozieren und verhindern“Öffnen Sie zwei Sitzungen (S1 und S2) nebeneinander.
-
Lost Update erzeugen: Führen Sie folgende Schritte in dieser Reihenfolge aus. Beide Sitzungen lesen denselben Saldo und schreiben unabhängig zurück:
-- S1 -- S2BEGIN;SELECT saldo FROM konten WHERE konto_id = 1; -- liest 1000BEGIN;SELECT saldo FROM konten WHERE konto_id = 1; -- liest 1000UPDATE konten SET saldo = 1000 + 100 WHERE konto_id = 1;COMMIT;UPDATE konten SET saldo = 1000 + 50 WHERE konto_id = 1;COMMIT;Welcher Saldo steht am Ende in Konto 1? Welche Buchung ging verloren und warum?
-
Verhindern: Wiederholen Sie das Szenario, aber lassen Sie beide Sitzungen die Zeile mit
SELECT ... FOR UPDATEsperren, bevor sie rechnen. Beschreiben Sie, was S2 nun tut, während S1 seine Transaktion noch offen hat. -
Erklären Sie in zwei bis drei Sätzen, warum ein einziges
UPDATE konten SET saldo = saldo + 100das Problem gar nicht erst entstehen lässt, ein „lesen, im Programm rechnen, zurückschreiben” dagegen schon.
Wissenscheck
Abschnitt betitelt „Wissenscheck“- Wofür stehen die vier Buchstaben in ACID?
- Was bewirkt
ROLLBACK, und in welchem Zustand ist die Datenbank danach? - Warum müssen die beiden
UPDATE-Anweisungen einer Überweisung in derselben Transaktion stehen? - Was ist ein Lost Update, und wie kommt es zustande?
- Wodurch verhindert
SELECT ... FOR UPDATEdas Lost Update?
- Die Datei
aufgabe01_transaktionen.sqlmit allen Abfragen, fehlerfrei ausführbar, SQL-Schlüsselwörter konsistent groß. - Eine kurze Notiz (drei bis fünf Sätze) zu Teil D: welcher Saldo herauskam und warum.
HTL Villach, Schuljahr 2026-2027,
https://www.htl-villach.at