Übung Transaktionen Lösungen Dr. Christian Senger DB & IS II, SS15 21.3.2015 1) Wiederholung Durch welche 4 Prinzipien sind Transaktionen gekennzeichnet? Unter welchen Bedingungen ist man gezwungen, mehrere Datenbank-Updates in einer Transaktion zusammenzufassen. Gebe ein Beispiel dafür. Welches sind die Befehle, mit denen man eine Transaktion definiert bzw. programmiert? Erläutere sie und beschreibe jeweils, was sie tun. Du hast drei verschiedene Probleme kennen gelernt, die bei konkurrierenden Zugriffen auf eine Datenbank auftreten können. Nenne und beschreibe diese. Nenne die vier vorgestellten Isolierungslevel und erkläre was diese ermöglichen oder verhindern. 2) Eine Tabelle schlafplatz_belegung soll folgenden Felder haben: schlafplatz_id, teilnehmer_id, datum. Eine andere Tabelle freie_schlafplaetze soll die Attribute schlafplatz_id, datum, freie_plaetze haben. Erstelle die Tabellen. Setze die passenden Primärschlüssel. Schreibe die Statements auf. CREATE TABLE schlafplatz_belegung( schlafplatz_id NUMBER NOT NULL, teilnehmer_id NUMBER NOT NULL, datum DATE NOT NULL, CONSTRAINT pk_schlafplatz_belegung PRIMARY KEY( schlafplatz_id, teilnehmer_id, datum)); CREATE TABLE freie_schlafplaetze( schlafplatz_id NUMBER NOT NULL, datum DATE NOT NULL, freie_plaetze NUMBER NOT NULL, CONSTRAINT pk_freie_schlafplaetze PRIMARY KEY (schlafplatz_id, datum)); Fülle freie_schlafplaetze mit mind. einem Datensatz mit einer bestimmten ID a, einem Datum b, und 4 freien Plätzen. INSERT INTO freie_schlafplaetze VALUES(1,'11.11.2009', 4); Fasse die Operationen in einer Transaktion zusammen, die nötig sind, wenn ein Teilnehmer sich zum Datum b auf dem Platz a einbucht. Schreibe die Statements auf. INSERT INTO schlafplatz_belegung VALUES(1, 5, '11.11.2009'); UPDATE freie_schlafplaetze SET freie_plaetze = freie_plaetze -1 WHERE datum = '11.11.2009' AND schlafplatz_id = 1; Öffne 2 SQL-Plus-Konsolen. Führe die Statements in einer Konsole aus, ohne COMMIT. Selektiere die Anzahl freier Plätze in der zweiten Konsole. Wie viele sind es? Buche auf der zweiten Konsole einen anderen Teilnehmer zum gleichen Tag mit den gleichen Statements ein. Was passiert? Beende die Transaktion in der ersten Konsole mit einem COMMIT. Beende die Transaktion in der zweiten Konsole mit einem ROLLBACK. Folgende Aufgabe könnt Ihr erst nach der nächsten Vorlesung lösen, oder Ihr bereitet jetzt die nächste Vorlesung (PL/SQL) vor…. Schreibe einen SQL-Codeblock, der eine Einbuchung macht, aber die Schlafplatzbelegung wieder Rückgängig macht, wenn die Anzahl freier Plätze danach < 0 ist. SET SERVEROUTPUT ON; DECLARE exception_kein_platz aktuelles_datum aktuelle_schlafplatz_id aktuell_freie_plaetze aktueller_teilnehmer BEGIN EXCEPTION; DATE := '11.11.2009'; NUMBER := 1; NUMBER; NUMBER := 5; SAVEPOINT vor_buchung; INSERT INTO schlafplatz_belegung VALUES(aktuelle_schlafplatz_id, aktueller_teilnehmer, aktuelles_datum); UPDATE freie_schlafplaetze SET freie_plaetze = freie_plaetze -1 WHERE datum = aktuelles_datum AND schlafplatz_id = aktuelle_schlafplatz_id; SELECT freie_plaetze INTO aktuell_freie_plaetze FROM freie_schlafplaetze WHERE datum = aktuelles_datum AND schlafplatz_id = aktuelle_schlafplatz_id; IF aktuell_freie_plaetze < 0 THEN RAISE exception_kein_platz; END IF; COMMIT; EXCEPTION WHEN exception_kein_platz THEN ROLLBACK TO vor_buchung; DBMS_OUTPUT.PUT_LINE('Zum ' || aktuelles_datum || ' gibt es bei Schlafplatz ' || aktuelle_schlafplatz_id || ' keinen Platz mehr'); END;