67 lines
2.4 KiB
SQL
67 lines
2.4 KiB
SQL
-- ============================================================================
|
||
-- 💡 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;
|