Lösung 4

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