Musterlösung - home.hs

Werbung
Ü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;
Herunterladen