Zum Inhalt springen

Aufgabe 01 - Transaktionen und ACID (Bankfiliale)

Zu Zen-Modus wechseln

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.

  • 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).
  • Sie klammern Anweisungen mit BEGIN, COMMIT und ROLLBACK zu 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 ROLLBACK rückgängig.
  • Sie provozieren ein Lost Update mit zwei Sitzungen und verhindern es mit einer Sperre.
  • 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).

Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.

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);
  1. 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.
  2. Wiederholen Sie dieselbe Buchung, diesmal mit COMMIT. Prüfen Sie erneut den Saldo.
  3. Erklären Sie in je einem Satz, wofür BEGIN, COMMIT und ROLLBACK stehen.
  1. Überweisen Sie in einer Transaktion 300 von Konto 1 auf Konto 2 (zwei UPDATE, dann COMMIT).
  2. 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.
  1. Versuchen Sie in einer Transaktion, 5000 von Konto 3 (Saldo 0) abzubuchen. Was passiert wegen der CHECK-Bedingung?
  2. 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.

  1. Lost Update erzeugen: Führen Sie folgende Schritte in dieser Reihenfolge aus. Beide Sitzungen lesen denselben Saldo und schreiben unabhängig zurück:

    -- S1 -- S2
    BEGIN;
    SELECT saldo FROM konten WHERE konto_id = 1; -- liest 1000
    BEGIN;
    SELECT saldo FROM konten WHERE konto_id = 1; -- liest 1000
    UPDATE 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?

  2. Verhindern: Wiederholen Sie das Szenario, aber lassen Sie beide Sitzungen die Zeile mit SELECT ... FOR UPDATE sperren, bevor sie rechnen. Beschreiben Sie, was S2 nun tut, während S1 seine Transaktion noch offen hat.

  3. Erklären Sie in zwei bis drei Sätzen, warum ein einziges UPDATE konten SET saldo = saldo + 100 das Problem gar nicht erst entstehen lässt, ein „lesen, im Programm rechnen, zurückschreiben” dagegen schon.

  1. Wofür stehen die vier Buchstaben in ACID?
  2. Was bewirkt ROLLBACK, und in welchem Zustand ist die Datenbank danach?
  3. Warum müssen die beiden UPDATE-Anweisungen einer Überweisung in derselben Transaktion stehen?
  4. Was ist ein Lost Update, und wie kommt es zustande?
  5. Wodurch verhindert SELECT ... FOR UPDATE das Lost Update?
  • Die Datei aufgabe01_transaktionen.sql mit 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