Isolationslevel festlegen und testen
In diesem Schritt lernen Sie die Transaktionsisolationslevel (transaction isolation levels) in PostgreSQL kennen und erfahren, wie Sie diese festlegen und testen können. Isolationslevel steuern den Grad, in dem gleichzeitige Transaktionen voneinander isoliert sind. Höhere Isolationslevel bieten einen besseren Schutz vor Datenbeschädigung, können aber die Parallelität (concurrency) verringern.
Sie sollten noch aus dem vorherigen Schritt mit der PostgreSQL-Datenbank verbunden sein. Wenn nicht, verbinden Sie sich erneut mit:
sudo -u postgres psql
Öffnen Sie zwei separate Terminalfenster. Stellen Sie in jedem Terminal eine Verbindung zur PostgreSQL-Datenbank als Benutzer postgres
her. Sie sollten zwei postgres=#
-Eingabeaufforderungen haben.
Terminal 1:
sudo -u postgres psql
Terminal 2:
sudo -u postgres psql
Setzen Sie in Terminal 1 das Isolationslevel auf READ COMMITTED
(obwohl dies die Standardeinstellung ist, werden wir es zur Demonstration explizit festlegen).
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Beginnen Sie dann eine Transaktion.
BEGIN;
Lesen Sie in Terminal 1 Alices Guthaben.
SELECT balance FROM accounts WHERE name = 'Alice';
Notieren Sie sich das Guthaben. Beginnen Sie nun in Terminal 2 eine Transaktion und aktualisieren Sie Alices Guthaben.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
UPDATE accounts SET balance = 90.00 WHERE name = 'Alice';
COMMIT;
Lesen Sie in Terminal 1 Alices Guthaben erneut.
SELECT balance FROM accounts WHERE name = 'Alice';
Da das Isolationslevel READ COMMITTED
ist, sehen Sie das aktualisierte Guthaben (90.00), das von Terminal 2 bestätigt (committed) wurde.
Testen wir nun das Isolationslevel REPEATABLE READ
. Machen Sie in Terminal 1 die aktuelle Transaktion rückgängig (Rollback) und setzen Sie das Isolationslevel auf REPEATABLE READ
.
ROLLBACK;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
Lesen Sie in Terminal 1 Alices Guthaben erneut.
SELECT balance FROM accounts WHERE name = 'Alice';
Notieren Sie sich das Guthaben. Beginnen Sie nun in Terminal 2 eine Transaktion und aktualisieren Sie Alices Guthaben erneut.
BEGIN;
UPDATE accounts SET balance = 100.00 WHERE name = 'Alice';
COMMIT;
Lesen Sie in Terminal 1 Alices Guthaben erneut.
SELECT balance FROM accounts WHERE name = 'Alice';
Da das Isolationslevel REPEATABLE READ
ist, sehen Sie immer noch das ursprüngliche Guthaben vom Beginn der Transaktion, auch wenn Terminal 2 einen neuen Wert bestätigt (committed) hat.
Bestätigen (commit) Sie abschließend die Transaktion in Terminal 1.
COMMIT;
Wenn Sie nun Alices Guthaben in Terminal 1 erneut lesen, sehen Sie den zuletzt bestätigten (committed) Wert (100.00).
Beenden Sie beide psql
-Shells.
\q