Universität Mannheim Lehrstuhl für Praktische Informatik III Thomas Neumann D7 27, Raum 415 68131 Mannheim Telefon: (0621) 181-2214 Email: [email protected] Transaktionssysteme 4. Übungsblatt, Sommersemester 2004 Lösungsvorschläge 1. Zeigen Sie, dass RC, ACA und ST präfix-commit abgeschlossen sind (vgl. Seite 24 im Skript). Wiederspruchsbeweis: Annahme, RC ist nicht ppc. ⇒ ∃H, H 0 : H ist RC und H 0 ≤ H ∧ C(H 0 ) ist nicht RC. ⇒ ∃T1 , T2 : T1 C(H 0 ) T2 ∧ c1 6<C(H 0 ) c2 aber: C(H 0 ) ⊆ H → T1 H T 2 ⇒ c1 <H c2 ⇒ c1 <C(H 0 ) c2 . Das ist ein Wiederspruch, deshalb ist RC ppc. ACA und ST sind analog. 2. Schreiben Sie ein Programm, das überprüft, ob zwei Historien sichtenäquivalent sind. import java.util.∗; /∗∗ Prft, ob zwei Historien quivalent sind ∗/ public class CheckViewEquivalent { /∗∗ Map updaten ∗/ private static void updateRead(Map read,String transaction,String element, String writer) { Map entries=(Map)read.get(transaction); if ( entries ==null) read.put(transaction,entries=new HashMap()); entries .put(element,writer); } /∗∗ ∗ Testet , ob zwei Historien sichten quivalent sind. Die Eingabe muss bereits ∗ vorbereitet sein ! ∗/ public static boolean checkEquivalentOperations(Operation[] a,Operation[] b ) { // Letztes Schreiben, dabei auch direkt daten frs Lesen sammeln 1 Map writeA=new HashMap(),readA=new HashMap(); Map writeB=new HashMap(),readB=new HashMap(); for (int index=0;index<a.length;index++) { if (a[index ]. operation==Operation.WRITE) writeA.put(a[index].element,a[index ]. transaction) ; if (a[index ]. operation==Operation.READ) updateRead(readA,a[index].transaction,a[index].element, (String)writeA.get(a[index ]. element)); } for (int index=0;index<b.length;index++) { if (b[index ]. operation==Operation.WRITE) writeB.put(b[index].element,b[index ]. transaction) ; if (b[index ]. operation==Operation.READ) updateRead(readB,b[index].transaction,b[index].element, (String)writeB.get(b[index ]. element)); } if (! writeA.equals(writeB)) return false; // Lesen prfen ... if (! readA.equals(readB)) return false; return true; } /∗∗ ∗ Testet , ob zwei Historien sichten quivalent sind ∗/ public static boolean checkEquivalent(Schedule a,Schedule b) { // Abgeschlossene Projektion a=a.completed(); b=b.completed(); // Trivialtests zuerst if ((a.operations.length!=b.operations.length) || (a. transactions .length!=b.transactions.length)) return false; // Toplogisch sortieren SortTopologically. sort(a.operations); SortTopologically. sort(b.operations); // Test return checkEquivalentOperations(a.operations,b.operations); } /∗∗ Das Hauptprogramm ∗/ public static void main(String[] args) throws java.io.IOException { if (args.length<2) { System.err. println (”usage: java ”+CheckConflictEquivalent.class. getName()+” <schedule> <schedule(s)>”); return; 2 } for (int index=0;index<args.length;index++) { Schedule a=Schedule.read(new java.io.BufferedReader(new java.io. FileReader(args[index]))); for (int index2=index+1;index2<args.length;index2++) { Schedule b=Schedule.read(new java.io.BufferedReader(new java.io. FileReader(args[index2]))); System.out.print(args[index]+” ”+args[index2]+”: ”); System.out.flush() ; if (checkEquivalent(a,b)) System.out.println(”equivalent”); else System.out.println(”not equivalent”); } } } } 3. Erläutern Sie, wie dadurch überprüft werden kann, ob eine Historie sichtenserialisierbar ist. Für jede Transaktion die Operationen bestimmen, anschließend die Transaktionen seriell anordnen und prüfen, ob eine der Permutationen sichtenequivalent zur Ursprünglichen Historie ist. 4. Welche Komplexität haben die Algorithmen? O(n!), wobei n die Anzahl Transaktionen ist. 3