Aufgaben-Python/courses/sql/14_transaktionen_acid_und_locking/musterloesung.sql

67 lines
2.4 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ============================================================================
-- 💡 SQL 14: MUSTERLÖSUNG – ACID TRANSAKTIONEN & SAVEPOINTS 💡
-- ============================================================================
CREATE TABLE IF NOT EXISTS konten (
konto_id INTEGER PRIMARY KEY,
inhaber TEXT NOT NULL,
iban TEXT UNIQUE NOT NULL,
kontostand REAL NOT NULL CHECK (kontostand >= 0)
);
CREATE TABLE IF NOT EXISTS transaktions_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
von_konto INTEGER NOT NULL,
an_konto INTEGER NOT NULL,
betrag REAL NOT NULL,
status TEXT NOT NULL,
zeitstempel TEXT NOT NULL,
FOREIGN KEY (von_konto) REFERENCES konten(konto_id),
FOREIGN KEY (an_konto) REFERENCES konten(konto_id)
);
CREATE TABLE IF NOT EXISTS warenkorb_reservierung (
id INTEGER PRIMARY KEY AUTOINCREMENT,
kunde_id INTEGER NOT NULL,
artikel_id INTEGER NOT NULL,
menge INTEGER NOT NULL,
status TEXT NOT NULL
);
INSERT OR REPLACE INTO konten (konto_id, inhaber, iban, kontostand) VALUES
(1, 'Max Mustermann', 'DE89370400440532013000', 1000.00),
(2, 'Sarah Connor', 'DE89370400440532013001', 2500.00),
(3, 'Tim Berg', 'DE89370400440532013002', 500.00);
-- 🎯 TODO 1: Erfolgreiche Banküberweisung mit COMMIT
BEGIN TRANSACTION;
UPDATE konten SET kontostand = kontostand - 300.00 WHERE konto_id = 1;
UPDATE konten SET kontostand = kontostand + 300.00 WHERE konto_id = 2;
INSERT INTO transaktions_log (von_konto, an_konto, betrag, status, zeitstempel)
VALUES (1, 2, 300.00, 'ERFOLGREICH', '2024-03-01 10:00:00');
COMMIT;
-- 🎯 TODO 2: Transaktionsabbruch mit ROLLBACK
BEGIN TRANSACTION;
UPDATE konten SET kontostand = kontostand + 1000.00 WHERE konto_id = 1;
-- Simulierter Fehlerzustand: Rollback macht alle Änderungen ungeschehen
ROLLBACK;
-- 🎯 TODO 3: Teil-Rollback mit SAVEPOINT
BEGIN TRANSACTION;
INSERT INTO warenkorb_reservierung (kunde_id, artikel_id, menge, status)
VALUES (1, 101, 2, 'RESERVIERT');
SAVEPOINT sp_zusatz_buchung;
INSERT INTO warenkorb_reservierung (kunde_id, artikel_id, menge, status)
VALUES (1, 999, 100, 'UNGÜLTIG');
ROLLBACK TO SAVEPOINT sp_zusatz_buchung;
COMMIT;
-- 🎯 TODO 4: Konsistenz-Audit (Bilanzprüfung)
SELECT
(SELECT SUM(kontostand) FROM konten) AS bilanz_summe,
(SELECT COUNT(*) FROM transaktions_log WHERE status = 'ERFOLGREICH') AS erfolgreiche_transfers;