Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

1 Jürgen Broß Übung: Transaktionale Systeme 31.05.2007.

Ähnliche Präsentationen


Präsentation zum Thema: "1 Jürgen Broß Übung: Transaktionale Systeme 31.05.2007."—  Präsentation transkript:

1 1 Jürgen Broß Übung: Transaktionale Systeme

2 2 Jürgen Broß Organisatorisches Bewertung, Scheinkriterien: 25% Projekt 20% Übung: Mindestens einmal vorrechnen! Aktive Teilnahme! 55% Klausur Projektzeitplan: Projektteil C ist optional, relevant nur für Projektscheinerwerb mind. Benotung von 2,0 für Projektteile A, B Entwicklungsumgebung: Java, Eclipse ProjektteilStartAbgabeBesprechung A B (C)

3 3 Jürgen Broß Projekt: Überblick Ziel: Verteiltes transaktionales Reisebuchungssystem Eine Reise besteht aus Flügen, Hotels, Mietwagen Einzelne Leistungen werden bei verschiedenen Anbietern gebucht RM Workflow ControllerTransaction Manager Client 1Client 2Client n Flight ReservationHotel ReservationRental Car Reservation …… ~ X/Open TX ~ X/Open XA

4 4 Jürgen Broß X/Open DTP Modell

5 5 Jürgen Broß Häufig gemachte Fehler… Das Schattenspeicherkonzept wurde teilweise nicht richtig umgesetzt! Es wird (beim commit) stets nur in eine Datei auf Festplatte geschrieben. Was passiert, wenn ein Fehler bei diesem Schreibvorgang auftritt? Zwei-Phasen-Schreiben notwendig (Codebeispiel) Beim Start einer Transaktion wird eine Kopie der Datenbasis erstellt. Startet eine weitere Transaktion wird diese Kopie wieder überschrieben. Es sind keine parallelen Transaktionen möglich! Gewünscht war, dass Updates einer Transaktion auf einer Kopie der Datenbasis ausgeführt werden. Von welcher Datenbasis liest eine Transaktion während ihrer Ausführung? Aktuelle Datenbasis, Kopie, beides? Nicht für jede Kopie eine Datei auf Platte erstellen!

6 6 Jürgen Broß Häufig gemachte Fehler… Synchronisation von Datenstrukturen vergessen: Datentyp HashMap ist nicht synchronisiert! Der RM wird von mehreren Threads (evtl. originär von entferntem Rechner) gleichzeitig genutzt! Besser Hashtable oder ConcurrentHashMap benutzen Oder über einen Aufruf von Collections.synchronizedMap(new HashMap ()) eine threadsafe HashMap erstellen Das Umsetzen des Schattenspeicher-Pointers geschieht nicht atomar, bzw. ist nicht synchronisiert. Zwei Transaktionen versuchen eventuell in die gleiche Datei zu schreiben, so dass es bei einer evtl. Recovery zu Problemen kommt! Welche? (Codebeispiel)

7 7 Jürgen Broß Häufig gemachte Fehler… Synchronisation von Datenstrukturen vergessen: Verwendung des Schlüsselworts volatile bei Variablen wie shutdown, dieAfter/BeforePointerswitch. Warum sinnvoll? Inkrementieren des XID-Zählers muss atomar sein! synchronized-Block schöner: AtomicInteger.incrementAndSet() Es wird explizit beim Aufruf der Methode dieBefore/AfterPointerSwitch ein Flag gesetzt, ob eine Recovery notwendig ist: Die die…()-Methoden sind ja nur zur Simulation von Fehlern gedacht. Die Recovery muss auch funktionieren, wenn ein Fehler nicht angekündigt wird!

8 8 Jürgen Broß Häufig gemachte Fehler… Zustand der Transaktionen wird über einen Systemstart hinweg vergessen: Welche Probleme treten beim Neustart auf, wenn ein Systemabbruch (z.B. durch dieNow) auftrat, während mehrere Transaktionen noch aktiv waren? Theoretisch könnte der Lockmanager noch Sperren der aktiven Transaktionen halten. Wie reagiert der RM, wenn ein Klient eine Operation für eine ehemals aktive, dann aber vergessene Transaktion ausführen will? Eindeutigkeit der XIDs ist nicht mehr gewährleistet, da vergessen wird, welche XIDs bereits vergeben wurden. Der XID-Zählerstand sollte persistiert werden.

9 9 Jürgen Broß Häufig gemachte Fehler… Shutdown-Flag wird zwar gesetzt, aber Shutdown wird nie ausgeführt: Thread in der shutdown()-Methode in einer Schleife schlafenlegen und warten bis keine Transaktion mehr aktiv ist. besser mit Thread.yield() Schöner: Bei jedem Commit/Abort überprüfen, ob gerade die letzte aktive Transaktion fertig geworden ist und dann ggf. System.exit() aufrufen. In einem Fehlerfall (Deadlock, IOException) nicht ein System.exit() aufrufen! Bei erkanntem Deadlock soll die Transaktion zurückgesetzt werden!

10 10 Jürgen Broß Häufig gemachte Fehler… Es wird zu grob-granular gesperrt: Sperre wird über einen Aufruf lock(,, LockManager.READ) angefordert. Konsequenz: Komplette Tabelle ist gesperrt. Und mehr noch: Eventuell sind sogar mehrere Tabellen gesperrt! Einfach auf : sperren… Aufwendiges Klonen von Objekten: Wenn shallow-copy ausreichend, dann reicht die Implementierung des Markerinterfaces Cloneable und ein Aufruf von super.clone() in der clone()- Methode. (Codebeispiel) Unterschied shallow-copy / deep-copy?

11 11 Jürgen Broß

12 12 Jürgen Broß Projekt: Teil A Schritt 2: Atomarität Gewährleistet durch Schattenspeicherkonzept Führe die Updates einer Transaktion auf einer Kopie der Datenbasis aus z.B. separate Hashtabellen Bei commit: Bringe Updates in die eigentliche Datenbasis (im Speicher) ein. Schreibe Datenbasis in separate Datei auf Hintergrundspeicher. (stetiger Wechsel zwischen zwei Dateien) In atomarem Schritt ändere globalen Zeiger so, dass die neue Datei als aktive Datenbasis markiert ist Bei abort: Verwerfe die separaten Hashtabellen (im Speicher) Shadowspeicher (Originalliteratur)

13 13 Jürgen Broß Projekt: Teil A Schritt 3: Isolation Implementierung von 2PL (rigoros) mithilfe des Lock Managers für jede Operation auf RM Lese- oder Schreibsperre anfordern bei commit/abort alle Lese-/Schreibsperren aufgeben Granularität der Locks so fein wie möglich für eine Operation maximale Parallelität möglichst keine Table-Locks Lock Manager erkennt Deadlocks durch Timeouts DeadLockException betroffene Transaktion abbrechen (abort)

14 14 Jürgen Broß Projekt: Teil A Schritt 4: Dauerhaftigkeit Persistenz und Recovery Zustand des Resource Managers auf Hintergrundspeicher schreiben: aktive Datenbasis Zustand von Transaktionen (start, commit, abort) XIDs Zeiger auf aktive Datenbasis Recovery, falls RM nicht korrekt heruntergefahren wurde (dieNow(), dieBeforePointerSwitch(), dieAfterPointerSwitch()) Welche Transaktionen waren vor Absturz bekannt? Welchen Zustand hatten diese Transaktionen?

15 15 Jürgen Broß Projekt: Teil A Test-Schnittstelle: shutdown(): warten, bis alle Transaktionen beendet sind keine neuen zulassen korrekten Zustand hinterlassen, so dass keine Recovery beim nächsten Start notwendig ist dieNow(): sofortiges System.exit(); dieAfter/BeforePointerSwitch(): setze Flag, so dass System.exit() während der nächsten Commit-Operation aufgerufen wird direkt vor bzw. direkt nach dem Ändern des Zeigers auf aktive Datenbasis


Herunterladen ppt "1 Jürgen Broß Übung: Transaktionale Systeme 31.05.2007."

Ähnliche Präsentationen


Google-Anzeigen