7. Übungsblatt. Für die Übung am Donnerstag, 14. Dezember 2006, von 15:30 bis 17:00 Uhr in 13/222.

Ähnliche Dokumente
AG Datenbanken und Informationssysteme Wintersemester 2006 / 2007

Grundlagen von Datenbanken SS 2010 Kapitel 8: Datenbank-Einbettung in Programmiersprachen Prof. Dr. Stefan Böttcher Universität Paderborn

Kapitel 10. JDBC und SQLJ. Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 1

Universität Augsburg, Institut für Informatik WS 2006/2007 Dr. W.-T. Balke 11. Dez M. Endres, A. Huhn, T. Preisinger Lösungsblatt 7

Datenbankschnittstellen erlauben Zugriff auf Datenbank aus einer externen Anwendung

Datenbanksysteme 2 Fachbereich Angewandte Informatik WS 11/12 Dipl.-Inf. Christian Pape. 6. Übung

JDBC. Es kann z.b. eine ODBC-Treiberverbindung eingerichtet werden, damit das JAVA-Programm auf eine ACCESS-DB zugreifen kann.

Willkommen. Datenbanken und Anbindung

Gruppe A Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

Java: MySQL-Anbindung mit JDBC.

1a) SQL Stored Procedure via IDs

Universität Augsburg, Institut für Informatik WS 2011/2012 Prof. Dr. W. Kießling 09. Dez Dr. M. Endres, Dr. S. Mandl, F. Wenzel Lösungsblatt 6

seit Java 1.1 Bestandteil der API: packages java.sql, javax.sql

Webbasierte Informationssysteme

Java Database Connectivity (JDBC) Walther Rathenau Gewerbeschule 1

Beispiel: DB-Mock (1/7)

DB-Programmierung. Lehr- und Forschungseinheit Datenbanken und Informationssysteme 1. Ziele. DB2 Zugriff mit Java selbst programmieren

6. Übungsblatt. Für die Übung am Donnerstag, 07. Dezember 2006, von 15:30 bis 17:00 Uhr in 13/222. Aufgabe 1: Eingebettetes SQL am Beispiel Lieferung

Datenbankentwurf & Datenbankzugriff mit JDBC. Georg Köster Sven Wagner-Boysen

Oracle & Java HOW TO

AG Datenbanken und Informationssysteme Wintersemester 2006 / 2007

Datenbankanwendungen (JDBC)

Client/Server-Programmierung

Datenbanksysteme 2011

Webbasierte Informationssysteme

Gruppe A Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

10. Übungsblatt. Für die Übung am Donnerstag, 15. Januar 2009, von 15:30 bis 17:00 Uhr in 13/222.

RELATIONONALE DATENBANKEN MIT JDBC

Datenbanken SQL JDBC. Programmieren II. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester / 21

Client/Server-Programmierung

JDBC. Java DataBase Connectivity

Programmieren II. Beispiele für RDBMS. Relationale Datenbanken. Datenbanken SQL. Dr. Klaus Höppner JDBC. Hochschule Darmstadt SS 2008

Gruppe A Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

UNIVERSITÄT ULM Fakultät für Ingenieurswissenschaften und Informatik Institut für Datenbanken und Informationssysteme

Datenbanksysteme I. Aufgabe 1: Erstellen einer Multimedia-Datenbank. Grundlage sind wiederum bereits implementierte Methoden aus Übungsblatt 6:

Lambda Expressions in Java 8

Klausur Datenbanken II

Database. Creates. -- Kunde(knr, nname, vname, adresse:adresse.aid) CREATE TABLE Kunde ( NUMERIC(13) PRIMARY KEY,

Universität Augsburg, Institut für Informatik WS 2009/2010 Prof. Dr. W. Kießling 18. Dez Dr. A. Huhn, F. Wenzel, M. Endres Lösungsblatt 8

Einführung in JDBC. IFIS Universität zu Lübeck

SQL Tutorium Documentation

Kapitel DB:VI (Fortsetzung)

Universität Augsburg, Institut für Informatik WS 2014/2015 Prof. Dr. W. Kießling 05. Dez F. Wenzel, L. Rudenko Lösungsblatt 7

Anwendungsentwicklung für relationale Datenbanken setzt voraus, dass prozedurale Abläufe programmiert werden können!

Ausnahmen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 27.6.

Ho Ngoc Duc IFIS - Universität zu Lübeck

Datenbankschnittstellen erlauben Zugriff auf Datenbank aus einer externen Anwendung

Klausur zur Vorlesung Datenbanksysteme I

SQLJ. Standardisierte Java-DB. DB-Schnittstelle. Spezifikationen. Oracle, IBM, Informix, Sybase,, Tandem, Sun, Microsoft stehen dahinter

Musterlösung Übungsblatt 11

Datenbanken (Übung 12)

Wie kommen die Befehle zum DBMS

vs. Fehler zur Übersetzungszeit

Modifikation der Datenbank

11 Anwendungsprogrammierung

Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

Gruppe A Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

JDBC Datenzugriff aus Java ETIS SS04

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Eigenschaften von TAs: ACID-Prinzip

Kapitel 11: Anwendungsentwicklung

PROGRAMMIERPROJEKT 2016 VERWENDETE TECHNOLOGIEN

Kapitel 11: Anwendungsentwicklung

Universität Augsburg, Institut für Informatik WS 2014/2015 Prof. Dr. W. Kießling 28. Nov F. Wenzel, L. Rudenko Lösungsblatt 6

GTUG September Ist das schon Konvergenz? Qualitätsinformationssysteme bei der ThyssenKrupp Steel Europe AG, KW4 Bochum

2 Eine einfache Programmiersprache

2 Eine einfache Programmiersprache. Variablen. Operationen Zuweisung. Variablen

MySQL mit MyLinux. 2/2003 Java unter Linux

GML und Bibliothek oracle.sdoapi

Java und Datenbanksysteme Datenbankanbindung mit JDBC

Vorlesung Informatik II

Semesterklausur. Hinweise:

Datenbank und Informationssysteme

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

Praktische SQL-Befehle 2

Java Database Connectivity-API (JDBC)

Bitte tragen Sie sofort und leserlich Namen, Studienkennzahl und Matrikelnummer ein und legen Sie Ihren Studentenausweis

Java Database Connectivity-API (JDBC)

Probeklausur Datenbanktechnologie

Einstieg in die Informatik mit Java

AG Datenbanken und Informationssysteme Wintersemester 2006 / Übungsblatt

Softwaretechnik 2015/2016

Kapitel 9. Embedded SQL. Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 1

Universität Augsburg, Institut für Informatik WS 2009/2010 Prof. Dr. W. Kießling 11. Dez Dr. A. Huhn, F. Wenzel, M. Endres Lösungsblatt 7

Datenbanken & Informationssysteme Übungen Teil 3

Atomare Commit-Protokolle. Grundlagen von Datenbanken - SS Prof. Dr. Stefan Böttcher Atomare Commit-Protokolle Folie 1

Einstieg in die Informatik mit Java

Einführung in die Programmierung mit Java

Dies ist eine Probeklausur, die keine formalen Schlüsse auf die Form, die Struktur oder den Inhalt der endgültigen Klausur zulässt.

Ziel: Verständnis für Konzepte von JDBC aufbauen

Konzeption und Implementierung eines Datenbank-Agenten für die Bereitstellung von Daten aus dem Verkehr

Transkript:

AG Datenbanken und Informationssysteme Wintersemester 2006 / 2007 Prof. Dr.-Ing. Dr. h. c. Theo Härder Fachbereich Informatik Technische Universität Kaiserslautern http://wwwdvs.informatik.uni-kl.de 7. Übungsblatt Für die Übung am Donnerstag, 14. Dezember 2006, von 15:30 bis 17:00 Uhr in 13/222. Aufgabe 1: JDBC und Rekursion Gegeben sei eine DB mit folgenden Relationen: TEIL (TNR, TNAME, GEWICHT) TEILSTRUKTUR (OTNR,UTNR, MENGE) In der TEIL-Relation befinden sich Teileinformationen wie Teilennummer, -name und -gewicht. Ein Teil kann zum einen aus mehreren Unterteilen bestehen, die jeweils wiederum Unterteile haben können. Zum anderen kann ein Teil ein Unterteil von mehreren Oberteilen sein. Weiterhin sei angenommen, dass ein Teil sich selbst sowohl direkt als auch indirekt nicht enthalten kann. Nur für Teile, die keine Unterteile besitzen, ist ein Gewicht ungleich 0 eingetragen. Die TEILSTRUKTUR-Relation beschreibt die Beziehung zwischen einem Oberteil und Unterteil mit der zugehörigen Mengenanzahl des Unterteils, die in den Oberteil eingeht. Basierend auf den beiden gegebenen Relationen schreiben Sie unter der Anwendung von JDBC ein rekursives Java-Programm, das den für den DB-Zugriff benötigten Benutzernamen und -passwort sowie eine Teilennummer als Eingabeparameter erhält und das Gesamtgewicht des eingegebenen Teils berechnet. Seite 1

Lösung: import java.sql.*; public class CalcWeight { public static float calculateweight (Connection conn, String otnr) throws SQLException { Statement stmt1 = conn.createstatement (); Statement stmt2 = conn.createstatement (); ResultSet rs1, rs2; float weight = 0; // Hole das Gewicht von otnr rs1 = stmt1.executequery( "SELECT gewicht FROM teil " + "WHERE tnr=" + otnr); " + // Hole Unterteile von otnr mit ihrer jeweiligen Mengenangabe pstmt2.setstring (1, otnr); rs2 = stmt2.executequery( "SELECT utnr,menge FROM teilstruktur "WHERE otnr=" + otnr); if (rs2.next ()) { // otnr hat mind. einen Unterteil, d.h. kein eigenes Gewicht weight += rs2.getint(2) * calculateweight(conn, rs2.getstring(1)); // Berechne dann weitere Unterteile while (rs2.next ()) { result += rs2.getint(2) * calculateweight(conn, rs2.getstring(1)); else { // otnr hat keine Unterteile, hole sein Gewicht rs1.next (); weight = rs1.getfloat (1); rs1.close (); rs2.close (); stmt1.close (); stmt2.close (); return (weight); public static void main (String [] argv) { String url = "..."; // Spezifiziere URL für die JDBC-Verbindung String user, passwd; String tnr; float weight; Connection conn; // Pruefe Eingabeparameter fuer die DB-Verbindung if (argv.length!= 3) { System.out.println ("Falsche Parameter: <userid> <passwd> <part number>."); Seite 2

System.exit (-1); user = argv[0]; passwd = argv[1]; tnr = argv[2]; try { // Lade JDBC-Treiber und erzeuge Verbindungsobjekt Class.forName ("..."); // Spezifiere JDBC-Treiber conn = DriverManager.getConnection (url, user, passwd); weight); weight = calculateweight (conn, tnr); System.out.println ("Gesamtgewicht von " + tnr + ": " + conn.close (); catch (ClassNotFoundException e) { System.out.println ("ClassNotFoundExceptionbeim Laden von JDBC-Driver: " + e.getmessage ()); catch (SQLException e) { System.out.println ("SQLException: " + e.getmessage()); Seite 3

Aufgabe 2: JDBC und Transaktionen Eine Flug-DB enthalte eine Relation SITZPLATZ, in der Sitzplatzreservierungen von Flügen gespeichert werden und deren Schema durch folgende SQL-Anweisung erzeugt wurde: CREATE TABLE SITZPLATZ( FLUGNR VARCHAR(6), DATUM DATE, REIHENNR SMALLINT, PLATZNR VARCHAR(1), KUNDENNAME VARCHAR(20), PRIMARY KEY (FLUGNR, DATUM, REIHENNR, PLATZNR)); Es wird angenommen, dass Tupel, die Flugsitzplätze repräsentieren, in der Relation SITZPLATZ bereits vorliegen. Hat ein Kunde einen Sitzplatz für einem Flug an einem bestimmten Tag reserviert, so steht sein Name im Attribut KUNDENNAME des entsprechenden Tupels. Freie Sitzplätze erkennt man an Tupeln, für die ein Nullwert im Attribut KUNDENNAME eingetragen ist. Ein Reservierungsvorgang für einen Kunden besteht aus den folgenden drei Phasen: (1) Anzeigen von freien Sitzplätzen bzgl. eines Fluges und Datums (2) Auswahl eines Sitzplatzes (3) Belegen des gewählten Sitzplatzes und bestätigen Schreiben Sie mit Hilfe von JDBC ein Java-Programm, das den oben beschriebenen Reservierungsvorgang im Mehrbenutzerbetrieb realisiert, und setzen Sie dabei das Transaktionskonzept ein. Es soll gewährleistet sein, dass kein Sitzplatz zweimal vergeben wird. Wenn ein Kunde eine Bestätigung für einen Sitzplatz bekommt, dann erhält er diesen garantiert. Achten Sie auch darauf, dass lange Wartezeiten bei der Durchführung eines Reservierungsvorgangs möglichst vermieden werden. Neben dem Benutzernamen und -passwort soll Ihr Programm die Flugnummer, das Flugdatum sowie den Kundennamen als Eingabeparameter erhalten. Die Sitzplatzwahl soll nach dem Anzeigen der freien Plätze eingelesen werden. Wenn der Platz gebucht ist, erhält der Kunde die Bestätigung. Lösung: import java.sql.*; public class Reservation { public static void main (String [] argv) { String url = "..."; // URL für die JDBC-Verbindung String user, passwd; Connection conn; Statement stmt; PreparedStatement pstmt1, pstmt2, pstmt3; ResultSet rs; int count; Date fdatum; // Flugdatum short rnr; // Reihennummer String fnr, kname, pnr; // Flugnummer, Kundenname und Platznummer // Pruefe Eingabeparameter fuer die DB-Verbindung if (argv.length!= 5) { Seite 4

System.out.println ("Falsche Parameterangaben: <userid> <password> <flight nr> <flight date> <customer name>."); System.exit (-1); user = argv[0]; passwd = argv[1]; fnr = argv[2]; fdatum = Date.valueOf (argv[3]); // Format ist "yyyy-mm-dd" kname = argv[4]; try { // Lade JDBC-Treiber und erzeuge Verbindungsobjekt Class.forName ("..."); // JDBC-Treiber conn = DriverManager.getConnection (url, user, passwd); // Erzeuge PreparedStatement-Objekte pstmt1 = conn.preparestatement ("SELECT reihennr, platznr " + "FROM sitzplatz " + "WHERE flugnr =? AND datum =?"); pstmt2 = conn.preparestatement ("SELECT * " + "FROM sitzplatz " + "WHERE flugnr =? AND datum =? AND " + "reihennr =? AND platznr =? AND kundenname IS NULL"); pstmt3 = conn.preparestatement ("UPDATE sitzplatz " + "SET kundenname =? " + "WHERE flugnr =? AND datum =? AND " + "reihennr =? AND platznr =?"); // Phase 1 : Anzeigen von freien Sitzplaetzen // Commit wird sofort nach der Ausführung von pstmt1 // ausgeführt und somit werden Lesesperren auf die gelesenen // Daten frei gegeben. Dadurch werden lange Sperr- // zeiten vermieden, da während der lange Entscheidungs- // phase (nehme ich den Sitzplatz?) keine Sperren ge- // halten werden. conn.setautocommit (true); pstmt1.setstring (1, fnr); pstmt1.setdate (2, fdatum); rs = pstmt1.executequery (); while (rs.next ()) { // Ausgabe der freien Sitzplätze... // Phase 2: Auswahl eines Sitzplatzes // Eingabe der ausgewählten Reihen- und Platznummer rnr =...; pnr =...; dann // wird der Sitzplatz belegt. Dieser Lese- und Schreibvorgang // Phase 3: Belegung des gewählten Sitzplatzes // Überprüfe zuerst, ob zu diesem Zeitpunkt der gewählte // Sitzplatz immer noch frei ist. Wenn dies der Fall ist, // wird innerhalb einer TA ausgeführt, damit der ausgewählte Seite 5

// Wartezeit, die durch die Denkzeit eines Kunden ver- kann. so ein lange ursacht frei."); // Sitzplatz von einem anderen Kunden nicht belegt werden conn.setautocommit (false); pstmt2.setstring (1, fnr); pstmt2.setdate (2, fdatum); pstmt2.setshort (3, rnr); pstmt2.setstring (4, pnr); rs = pstmt2.executequery (); if (! rs.next ()) { // Gewählter Sitzplatz ist nicht mehr frei // Denkt Kunde während der Auswahlphase zu lange nach, // kann der von ihm gewünschten Sitzplatz weg sein, da // anderer Kunde sich schneller dafür entschieden hat. // Diesen Nachteil nehmen wir in Kauf, um evtl. eine // wird, zu verhindern. throw new SQLException ("Sitzplatz ist nicht mehr // Update des Tupel zur Sitzplatzreservierung pstmt3.setstring (1, kname); pstmt3.setstring (2, fnr); pstmt3.setdate (3, fdatum); pstmt3.setshort (4, rnr); pstmt3.setstring (5, pnr); count = pstmt3.executeupdate (); conn.commit (); // Buchungsbestätigung nach erfolgreichem Commit... // Schließe Ressourcen pstmt1.close (); pstmt2.close (); pstmt3.close (); conn.close (); catch (ClassNotFoundException e) { System.out.println ("ClassNotFoundException beim Laden von JDBC-Driver: " + e.getmessage ()); catch (SQLException e) { System.out.println ("SQLException: " + e.getmessage()); // Führe rollback aus try { conn.rollback (); catch (SQLException ee) { System.out.println ("SQLException während Rollback-Ausführung: " + ee.getmessage ()); Seite 6

Aufgabe 3: Verteiltes 2-PC-Protokoll Betrachten Sie das vollständige Zweiphasen-Commit-Protokoll in der folgenden Umgebung mit einem Koordinator und drei Agenten, die vom Koordinator jeweils in der Reihenfolge A 1, A 2 und A 3 kontaktiert werden: C A 1 A 2 A 3 Welche und insgesamt wieviele Nachrichten werden gesendet und welche Log-Daten werden von den Komponenten geschrieben, wenn der Koordinator den Auftrag für ein Commit erhält und a) alle drei Agenten ohne Zwischenfall am Commit teilnehmen? b) der Agent A3 auf das empfangene PREPARE aufgrund eines internen Fehlers mit FAILED antwortet? c) der Agent A2 auf das empfangene PREPARE ein READY sendet, aber sofort danach abstürzt? Was passiert beim Wiederanlauf des Agenten? Lösung: a) Der Koordinator erhält den Auftrag für ein Commit und alle drei Agenten nehmen ohne Zwischenfall am Commit teil. Koordinator K Agent A1 Agent A2 Agent A3 Log Sende Empfang Log Sende Empfang Log Sende Empfang Log Sende Empfang Begin A1: Prepare A2: Prepare A3: Perpare K: Prepare K: Prepare Prepared K: Ready Prepared K: Ready K: Prepare A1: Ready A2: Ready A3: Ready Prepared K: Ready Commit A1: Commit A2: Commit A3: Commit K: Commit K: Commit Commit K: Ack Commit K: Ack K: Commit A1: Ack A2: Ack A3: Ack Commit K: Ack End (async) Seite 7

b) Der Koordinator erhält den Auftrag für ein Commit und der Agent A3 antwortet aufgrund eines internen Fehlers mit FAILED. Koordinator K Agent A1 Agent A2 Agent A3 Log Sende Empfang Log Sende Empfang Log Sende Empfang Log Sende Empfang Begin A1: Prepare A2: Prepare A3: Perpare K: Prepare K: Prepare Prepared K: Ready Prepared K: Ready K: Prepare A1: Ready A2: Ready K: Failed A3: Failed Abort A1: Abort A2: Abort A3: Abort K: Abort K: Abort Abort K: Ack Abort K: Ack K: Abort A1: Ack A2: Ack A3: Ack Abort K: Ack End (async) Seite 8

c) Der Koordinator erhält den Auftrag für ein Commit, der Agent A2 antwortet auf das PREPARE mit READY, stürzt aber sofort danach ab. Koordinator K Agent A1 Agent A2 Agent A3 Log Sende Empfang Log Sende Empfang Log Sende Empfang Log Sende Empfang Begin A1: Prepare A2: Prepare A3: Perpare K: Prepare K: Prepare Prepared K: Ready Prepared K: Ready K: Prepare A1: Ready A2: Ready A3: Ready Prepared K: Ready Commit A1: Commit A2: Commit A3: Commit Absturz und K: Commit Wiederanlauf Commit K: Ack K: Commit A1: Ack Commit K: Ack A3: Ack A2: Ready K: Ready A2: Commit K: Commit A2: Ack Commit K: Ack End (async) Seite 9

Aufgabe 4: Optimierungen für das 2-Phasen-Commit-Protokoll In dieser Aufgabe betrachten wir verschiedene Optimierungen für das 2-PC-Protokoll. Gegeben sei folgende Aufrufstruktur zwischen Koordinatoren und Agenten, die in einer hierarchischen Struktur angeordnet sind. Die Agenten werden von C 1 in der Reihenfolge A 1 /C 2,A 4, A 5 und von C 2 in der Reihenfolge A 2, A 3 angesprochen.: C 1 A 1 /C 2 A 4 A 5 A 2 A 3 Wie viele Nachrichten und Log-Ausgaben werden im Erfolgsfall versendet bzw. geschrieben, wenn: a) das vollständige hierarchische 2-PC-Protokoll verwendet wird? b) die spezielle Optimierung für Leser verwendet wird? c) A i nach jedem Aufruf in den Prepared-Zustand wechselt? d) A i erst beim letzten Aufruf in den Prepared Zustand wechselt? e) die ACK-Nachricht expizit weggelassen wird? f) das "spartanische Protokoll" zum Einsatz kommt? Auf was ist bei den entsprechenden Realisierungsformen zu achten? Lösung: a) Nachrichten: (3+2) * 1 (Prepare) + (3+2) * 1 (Ready) + (3+2) * 1 (Commit) + (3+2) * 1 (Ack) = 4 (Nachrichtenarten) * 5 (Teil-TAs, N)) = 20 Nachrichten Log-Ausgaben: 2 (Beginn, Committing) * 1 (C1) + 2 (Prepared, Committing) * N (A1,..,A5) = 2 + 2 * 5 (Teil-TAs, N) = 2 * 6 = 12 synchrone Log-Nachrichten Achtung! Es kann zu Blockierungen kommen. z.b. bei Ausfall eines Koordinators. b) Annahme: 2 Agenten (z.b. A4, A5) werden nur lesend zugegriffen (M=2) Nachrichten: 4*(3+2) - 2 (Commit, Ack) * 2 (M) = 20-4 = 16 Nachrichten Log-Ausgaben: (2 + 2 * N) - 2 (Prepared, Committing) * M = 12-2 * 2 = 8 c) Nachrichten: 1. Phase fällt flach! 2 (Commit, Ack) * N = 2 * 5 = 10 Nachrichten Log-Ausgaben: Für jeden Auftrag (Anz Aufträge pro TA = K) in Ai muss (Prepared, Committing) geloggt werden!! => 2 + N * (K+1) = (mit K = 10): 2 + 5 * 11 = 57! Seite 10

d) Nachrichten: wie bei c) = 10 Nachrichten (gleiche Begründung) Log-Ausgaben: Prepare mit letztem Auftrag, dann Committing wie immer: 2 + 2 (Prepare, Committing) * N = 2 * (N+1) = 12 synchrone Log-Nachrichten. Problem: Woher kenne ich den immer den letzten Auftrag? Was passiert, wenn Ai nochmals benötigt wird? e) Nachrichten: Ack-Nachricht fällt weg. = 3 (Nachrichtentypen) * 5 (Teil-TAs) = 15 Log-Nachrichten: keine Veränderung zu a) Vorsicht! Impliziert unendlich langes Gedächtnis des Koordinators f) Nachrichten: nur noch 1 (Nachrichtentyp, Commit) * 5 = 5 Nachrichten Log-Nachrichten: wie c) 2 + N * (K+1) = (mit K = 10): 2 + 5 * 11 = 57! bzw. d) 2 + N * (1+1) = 12 Probleme von d) und e) Aufgabe 5: Schachtelung von Transaktionen Können Transaktionen, die bekanntlich ACID-Eigenschaften besitzen, geschachtelt werden? Begründen Sie Ihre Anwort. Lösung: Transaktionen mit ACID-Eigenschaften können nicht geschachtelt werden. Betrachte folgendes Beispiel: BOT T A... BOT T B Update Tupel t Commit T B... Rollback T A Wird T A nach dem Commit von T B zurückgesetzt, so dürfte das Commit von T B kein "richtiges" Commit sein, denn sonst wäre die Änderung des Tupels t persistent. Handelt es sich jedoch um ein "richtiges" Commit bei T B, so muss die Änderung von t aufgrund der D-Eigenschaft in der DB dauerhaft bleiben und T A kann daher nicht zurückgesetzt werden, sondern müsste durch eine weitere Operation kompensiert werden. Bem.: Siehe Date, 7. Auflage, 471p. Seite 11