uni:8:dbs2:start
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| uni:8:dbs2:start [2015-06-30 15:01] – [Aufgabe 2] skrupellos | uni:8:dbs2:start [2020-11-18 18:11] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Datenbanksysteme II ====== | ====== Datenbanksysteme II ====== | ||
| - | ===== Übung 1 ===== | + | |
| - | | + | * [[zusammenfassung]] |
| - | * **Hauptaufgabe der Transaktionen - Verwaltung** | + | |
| - | * Synchronisation (Koordination von mehreren Benutzerproxessen => Logische Einbenutzerbetrieb) | + | |
| - | * Recovery (Behebung von Fehlersituationen) | + | |
| - | * **Eigenschaften von Transaktionen (ACID-Prinzip)** | + | |
| - | * **A**tomicy (Atomarität: | + | |
| - | * **C**onsistency (Konsistenz/ | + | |
| - | * **I**solation (Isoliertheit: | + | |
| - | * **D**urability (Dauerhaftigkeit, | + | |
| - | * **Schedule** \\ Folge von Aktionen (read/ | + | |
| - | * **Serieller Schedule** \\ Schedule S von $\{T_1, \ldots, T_n\}$, in dem die Aktionen der einzelnen Transaktionen nicht unter einander verzahnt sind, sondern sin Blöcken hintereinander ausgeführt werden | + | |
| - | * **Serialisierbarer Schedule** \\ Schedule S von $\{T_1, \ldots, T_n\}$, der die selbe Wirkung hat, wie ein belibiger serieller von $\{T_1, \ldots, T_n\}$ => Nur serialisierbarer Schedules dürfen zugelassen werden! | + | |
| - | ==== Aufgabe 1 ==== | ||
| - | Mögliche Abhängigkeiten | ||
| - | * rw | ||
| - | * wr | ||
| - | * ww | ||
| - | |||
| - | Für $S_1$ | ||
| - | $T_1$ = (r(v), w(v)) | ||
| - | $T_2$ = (w(x), w(w), r(v)) | ||
| - | $T_3$ = (w(z), r(y), w(x)) | ||
| - | $T_4$ = (r(w), r(z), W(y)) | ||
| - | |||
| - | === a === | ||
| - | => Gleiche Tranasktions- & Aktionsmenge! | ||
| - | |||
| - | Abhängigkeiten: | ||
| - | * $S_1$: $rw_{4, | ||
| - | * $S_2$: $rw_{4, | ||
| - | => $S_1$ & $S_2$ sind nicht Konfliktäquivalent! | ||
| - | |||
| - | === b === | ||
| - | => Gleiche Tranasktions- & Aktionsmenge! | ||
| - | |||
| - | Abhängigkeiten: | ||
| - | * $S_1$: $rw_{4, | ||
| - | * $S_3$: $wr_{3, | ||
| - | => $S_1$ & $S_2$ sind Konfliktäquivalent! | ||
| - | |||
| - | |||
| - | ==== Aufgabe 2 ==== | ||
| - | Serialisierungs-/ | ||
| - | * Knoten: Transaktionen | ||
| - | * Kanten: Abhängigkeiten | ||
| - | * Zyklenfrei: Topologische Ordnung = serielle Ausführung | ||
| - | * enthält zyklen: S ist nicht seriallisierbar | ||
| - | |||
| - | a) T1, T2, T4, T3 oder T1, T4, T2, T3 | ||
| - | b) nicht serialisierbar | ||
| - | |||
| - | ==== Aufgabe 3 ==== | ||
| - | * a): Lost Update $S(r_1(x), w_2(x), w_1(x))$ \\ => Änderungen einer Transaktion werden durch eine andere Transaktion überschrieben und gehen verloren. | ||
| - | * b): Dirty Read/Write: $S(w_1(x), r_2(x), w_1(x))$ \\ => Zugriff auf " | ||
| - | * c): Non-Repeatable Read: $S(r_1(x). w_2(x), r_1(x)$ \\ => Transaktion liest unterschiedliche Werte des selben Objekts | ||
| - | |||
| - | => Annomalien können nur auftreten, wenn // | ||
| - | |||
| - | ===== Übung 2 ===== | ||
| - | ==== Aufgabe 1 ==== | ||
| - | Legaler Schedule | ||
| - | * LOCK (L) vor jedem Zugriff | ||
| - | * UNLOCK (U) spätestens bei TA=Ende | ||
| - | * Keine TA fordert Sperre an, die sie bereits besitzt | ||
| - | * Sperren werden respektiert | ||
| - | * Man darf keine sperren zurückgeben, | ||
| - | |||
| - | |||
| - | * 2-Phasen-Sperrprotokoll (2PL): | ||
| - | - Wachstumsphase (lock) | ||
| - | - Schrumpfungsphase (unlock) | ||
| - | |||
| - | Problem von 2PL: Kaskadierendes Rücksetzen (T1 wird nach U1(x) zurückgesetzt (ABORT) => alle T2. die nach U1(x) auf x zugegriffen haben, müssen auch zurückgesetzt werden => Durability | ||
| - | |||
| - | * Striktes 2PL | ||
| - | * alle Sperren werden bis zum COMMIT gehalten | ||
| - | * COMMIT wird atomar durchgeführt | ||
| - | * | ||
| - | |||
| - | Es gild | ||
| - | * 2PL => serialisierbar | ||
| - | * serialisierbar NOT => 2PL | ||
| - | * | ||
| - | |||
| - | S0 | ||
| - | * wird nicht freigegeben vor TA ende | ||
| - | * T2 gibt sperre frei, die sie nie hatte | ||
| - | * => Nicht legal | ||
| - | S1 | ||
| - | * nicht legal, da sperre auf x doppelt vergeben wird | ||
| - | * => Nicht legal | ||
| - | S2 | ||
| - | * => Legal | ||
| - | * => Nicht 2PL, da T1 nach U1(x) noch L1(y) anfordert | ||
| - | * => s2 ist serialisierbar, | ||
| - | * | ||
| - | S3 | ||
| - | * Unlock von T1 nicht atomar => kein striktes 2PL | ||
| - | * TODO | ||
| - | * | ||
| - | S4 | ||
| - | * => Legal | ||
| - | * => 2PL erfüllt | ||
| - | * | ||
| - | |||
| - | ==== Aufgabe 2 ==== | ||
| - | Verklemmung bezgl. Zugriff auf Verschiedene Objekte: | ||
| - | - T1 hält x(x) | ||
| - | - T1 will x(y) | ||
| - | - T2 hält x(y) | ||
| - | - T2 will x(x) | ||
| - | => Verlemmung, da T1 und T2 gegenseitig warten | ||
| - | |||
| - | Verklemmung bzgl. Sperrkonversion: | ||
| - | T1 und T2 warten gegenseitig, | ||
| - | |||
| - | Verhungern einer Transaktion auf erforderliche Sperre. | ||
| - | |||
| - | ^bestehend -> \\ angefordert ^ R ^ X ^ | ||
| - | ^ R | (+) | (-) | | ||
| - | ^ X | (-) | (-) | | ||
| - | |||
| - | ^bestehend -> \\ angefordert ^ R ^ U ^ X ^ | ||
| - | ^ R | (+) | (-) | (-) | | ||
| - | ^ U | (+) | (-) | (-) | | ||
| - | ^ X | (-) | (-) | (-) | | ||
| - | |||
| - | ^bestehend -> \\ angefordert ^ R ^ A ^ X ^ | ||
| - | ^ R | (+) | (+) | (-) | | ||
| - | ^ A | (+) | (-) | (-) | | ||
| - | ^ X | (-) | (-) | (-) | | ||
| - | |||
| - | |||
| - | ^ ^ RX ^ RUX ^ RAX ^ | ||
| - | ^ a) | (V) | (V) | (V) | | ||
| - | ^ b) | (V) | (X) | (X) | | ||
| - | ^ c) | (V) | (X) | (V) | | ||
| - | |||
| - | ==== Aufgabe 3 ==== | ||
| - | ^ ^ R ^ X ^ IR ^ IX ^ RIX ^ | ||
| - | ^ R | (+) | (-) | (+) | (-) | (-) | | ||
| - | ^ X | (-) | (-) | (-) | (-) | (-) | | ||
| - | ^ IR | (+) | (-) | (+) | (+) X| (+) X| | ||
| - | ^ IX | (-) | (-) | (+) X| (+) X| (-) | | ||
| - | ^ RIX | (-) | (-) | (+) X| (-) | (-) | | ||
| - | |||
| - | IR-Sperre: tiefere Ebene hat R-Sperre | ||
| - | IX-Sperre: tiefere Ebene hat X-Sperre | ||
| - | RIX-Sperre: | ||
| - | |||
| - | a) R-Sperre auf Tutpelebene entspricht IR-Sperre (auf Relationsebene) | ||
| - | => Falls es sich um das selbe Tupel handelt, darf die Sperre nicht vergeben werden, sonst schon | ||
| - | |||
| - | b) | ||
| - | * Phantomproblem: | ||
| - | * Hierachisches Sperren: Für Aggregartfunktionen R-Sperre auf gesammter Relation anfordern, Einfügen würde IX-Sperre anfordern, die aber nicht gewährt wird. | ||
| - | ==== Aufbau ==== | ||
| - | * DB-Anwendung | ||
| - | * DBS | ||
| - | * DBMS | ||
| - | * DB | ||
| - | |||
| - | | Anwendungen (mehrere) | ||
| - | ^ | ||
| - | ^ | ||
| - | ^ Konzeptionelle Ebene | | | ||
| - | ^ | ||
| - | ^ | ||
| - | ===== Probeklausur 1/2 ===== | ||
| - | ==== Aufgabe 1 ==== | ||
| - | * Falsch \\ Die Knoten sind die Transaktionen | ||
| - | * Wahr | ||
| - | * Wahr \\ mindestens alles was ich | ||
| - | * Fals \\ Das währe FOCC | ||
| - | |||
| - | ==== Aufgabe 2 ==== | ||
| - | === a) === | ||
| - | Zyklus in Graph => Es liegen verklemmungen vor | ||
| - | |||
| - | === b) === | ||
| - | * Jüngere TA hält Sperre \\ => ältere TA " | ||
| - | * Ältere TA hält Sperre \\ => jüngere TA " | ||
| - | |||
| - | * $L_1(y)$ => $T_3$ wird zurückgesetzt | ||
| - | * $L_2(z)$ => $T_2$ wartet | ||
| - | * $L_1(x)$ => $T_2$ wird zurückgesetzt | ||
| - | * $L_3(x)$ => $T_3$ bereits zurückgesetzt | ||
| - | |||
| - | => $T_1$ kommt durch | ||
| - | |||
| - | === c) === | ||
| - | * Jüngere TA hält Sperre \\ => ältere TA " | ||
| - | * Ältere TA hält Sperre \\ => ältere TA " | ||
| - | |||
| - | * $L_1(y)$ => $T_1$ wartet | ||
| - | * $L_2(z)$ => $T_2$ wird zurückgesetzt | ||
| - | * $L_1(x)$ => $T_1$ wartet bereits auf die Freigabe von y | ||
| - | * $L_3(x)$ => $T_3$ bekommt sperre, da $T_2$ zurückgesetzt wurde und $T_1$ noch auf die Freigabe von y wartet (nicht so weit kam sich x zu schnappen) | ||
| - | |||
| - | => $T_3$ & $T_1$ kommen durch | ||
| - | |||
| - | ==== Aufgabe 3 ==== | ||
| - | $T_2, T_3, T_5, T_4, T_1$ | ||
| - | |||
| - | ==== Anforderungen ==== | ||
| - | * **Integration** // | ||
| - | * **Operationen** auf den Daten (ändern, löschen, ...) | ||
| - | * **Data Dictionary** Schema anschauen | ||
| - | * **Benutzersicheten** views | ||
| - | * **Konsistenzüberwachung** bei Änderung | ||
| - | * **Zugriffskontrolle** | ||
| - | * **Transaktionen** | ||
| - | * **Synchronisation** (Mehrbenutzersystem) | ||
| - | * **Datensicherung** | ||
| - | |||
| - | * Datensystem (deskriptive Anfragen, Mengenzugriffe) | ||
| - | * Zugriffssystem (Satzzugriffe) | ||
| - | * Speichersystem (Seitenzugriffe) | ||
| - | * DB (Blocktransfer) | ||
| - | |||
| - | Neben an: | ||
| - | * Transfermanagement??? | ||
| - | * Metadatenverwaltung | ||
| - | |||
| - | Drüber: | ||
| - | * Anwendung | ||
| - | * | ||
| - | |||
| - | ===== Übung 4 ===== | ||
| - | ==== Aufgabe 1 ==== | ||
| - | === a) === | ||
| - | Loggranulat <= Sperrgranulat, | ||
| - | |||
| - | |||
| - | Update-in-place: | ||
| - | === b) === | ||
| - | Einbringstrategien | ||
| - | * direktes Einbringne (??? | ||
| - | * Geänderte Werte werden auf ihre ursprüngliche Position zurückgeschrieben. d.h. Schreibe ist gleichzeitig Einbringen i.d. DB | ||
| - | |||
| - | |||
| - | |||
| - | ==== Aufgabe 4 ==== | ||
| - | * '' | ||
| - | denn sonsst: 4-1 c) Schritt 4 (save[B', | ||
| - | | ||
| - | |||
| - | * Commit-Regel (Force log ab commit): | ||
| - | REDO Info muss vor COMMIT-Durchführung in der Log-Datei stehen (=> relevant für No-Focre) | ||
| - | |||
| - | ===== Übung 5 ===== | ||
| - | ==== Aufgabe 1 ==== | ||
| - | Aufgabe des Logging: | ||
| - | * Jede Änderung auf der DB im Normalbetrieb wird protokolliert: | ||
| - | * REDO: Informationen zum Nachvollziehen der Änderungen erfolgreicher TAs | ||
| - | * UNDO: Informationen zum Zurücknehmen der Änderungen unvollständiger transaktionen | ||
| - | * Klassifikation von Logging-Verfahren: | ||
| - | * physisch: Protokoll auf Ebene der Seiten, Datensätze, | ||
| - | * Zustands-Logging: | ||
| - | * Übergangs-Logging: | ||
| - | * Logisch: Speicherung der Änderungsoperationen mit ihren Parametern -> kürzere Logeinträge | ||
| - | * PhysiologischL Kombination aus beidem | ||
| - | * Struktur der Log-Einträge für Anderungen: | ||
| - | * LSN (Log Sequence Number): Eindeutige Kennung des Log-Eintrags in chronologischer Reihenfolge | ||
| - | * TA-ID: Eindeutige Kennung der TA, die die Änderung durchgeführt hat | ||
| - | * Page-ID: Kennung der Seite auf der die Änderungsoperation vollzogen wurde (ein Eintrag pro geänderter Seite) | ||
| - | * REDO: Gibt an, wie die Änderung nachvollzogen werden kann | ||
| - | * UNDO: Beschreibt, wie die Änderung rückgängig gemacht werden kann | ||
| - | * PerLSN: Zeiger auf den vorhergehenden Log-Eintrag der jeweiligen TA (Effizienzgründe) | ||
| - | * Log-Sätze: Ein Log-Satz wird für jede der follgenden Aktionen geschrieben: | ||
| - | * CLR (Compensation Log Record): Beim Zurücksetzen der TA (UNDO) werden Aktionen rückgängig gemacht, das Logging hiervon geschieht durch das Schreiben eines CLR. | ||
| - | * | ||
| - | |||
| - | === b) === | ||
| - | ^ Seite ^ PageLSN \\ (Puffer) | ||
| - | | $P_A$ | 90 | 90 | | ||
| - | | $P_B$ | 130 | 0 | | ||
| - | | $P_C$ | 50 | 50 | | ||
| - | | $P_D$ | 70 | 0 | | ||
| - | | $P_E$ | 110 | 60 | | ||
| - | |||
| - | ==== Aufgabe 2 ==== | ||
| - | === a) === | ||
| - | Weitere Datenstrukturen beim Recovery: | ||
| - | * TA-Tabelle: | ||
| - | * Ein Eintrag | ||
| - | * Enthält | ||
| - | * TA-ID | ||
| - | * Status (running / commited / aborted) | ||
| - | * LastLSN (letzte vergebe LSN) | ||
| - | * DirtyPage-Tabelle: | ||
| - | * Ein Eintrag pro Schmutziger Seite im Puffer | ||
| - | * Einthält recLSN (LSN des Log-Satzes, durch den erstmals die Seite schmutzige wurde) | ||
| - | |||
| - | Phasen der Crash-Recovery: | ||
| - | - Analysephase | ||
| - | - Lies Log-Datei von letztem Check Point bis Ende | ||
| - | - Bestimme Gewinner & Verlierer TAs: | ||
| - | * Gewinner: COMMIT-Satz in Log | ||
| - | * Verlierer: Kein COMMIT-Satz im Log | ||
| - | - Ermittler geänderte Seiten | ||
| - | - REDO-Phase | ||
| - | - Vorwärtslesen der Log-Datei, ausgehend vom letzten Sicherungspunkt. | ||
| - | - Wiederholen der Änderunge die noch nicht in der DB stehen pageLSN(DB) < LSN | ||
| - | * Vollständiges REDO: Wiederholung __aller__ UPDATES & LLRs (auch der abgebrochenen TAs) | ||
| - | * Selektives REDO: Wiederhochung der Updates der Gewinner TAs & LLRs | ||
| - | - UNDO-Phase | ||
| - | - Rückwärtslesen der Log-Datei bis BOT der ältesten Verlierer TA | ||
| - | - Verlierer TAs zurücksetzen | ||
| - | * Vollständiges REDO: Nur wenn Fehlerzeitpunkt laufende TAs zurücksetzen | ||
| - | * Selektives REDOL alle verlierer TAs zurücksetzen genau dann wenn LSN <= pageLSN(DB) | ||
| - | |||
| - | === b) === | ||
| - | * Gewinner TAs: $T_1$ & $T_3$ | ||
| - | * Verlierer TAs: $T_2$ & $T_4$ | ||
| - | * Betroffene Seiten: $P_A$, $P_B$, $P_C$, $P_D$, $P_E$ | ||
| - | |||
| - | Idempotenz von UNDO & REDO: \\ | ||
| - | REDO- und UNDO-Phasen müssen idempotent sein, d.h. sie müssen auch bei mehrfacher Ausführung immer wieder das selbe Ergebniss liefern: $f(f(x)) = f(x)$ | ||
| - | |||
| - | Idempotenz von REDO wird durch Check der pageLSN (Platte) sichergestellt. | ||
| - | |||
| - | Idempotenz von UNDO wird durch CLRs sichergestellt. | ||
| - | |||
| - | Vollständiges REDO: | ||
| - | ^ TA ^ Seite ^ PageLSN vs LSN ^ Änderungen in \\ der DB (Platte) ^ | ||
| - | | $T_1$ | $P_B$ | $0 < 20$ | $P_B, 20$ | | ||
| - | | $T_4$ | $P_C$ | $50 \not< 50$ | | | ||
| - | | $T_1$ | $P_E$ | $60 \not< 60$ | | | ||
| - | | $T_4$ | $P_D$ | $0 < 70$ | $P_D, 70$ | | ||
| - | | $T_2$ | $P_A$ | $90 \not< 90$ | | | ||
| - | | $T_3$ | $P_E$ | $60 < 110$ | $P_E, 110$ | | ||
| - | | $T_2$ | $P_B$ | $0 < 130$ | $P_B, 130$ | | ||
| - | |||
| - | UNDO: | ||
| - | ^ TA ^ Seite ^ Zur Log-Date hinzugefügte Log-Einträge ^ Änderungen auf der DB Platte ^ | ||
| - | | $T_2$ | $P_B$ | $180, T_2, P_B, R(B), U(B), 130$ | $P_B, 180$ | | ||
| - | | $T_2$ | $P_A$ | $190, T_2, P_A, R(A), U(A), 180$ | $P_A, 190$ | | ||
| - | | $T_4$ | $P_D$ | $200, T_4, P_D, R(D), U(D), 70$ | $P_D, 200$ | | ||
| - | | $T_4$ | $P_C$ | $210, T_4, P_C, R(C), U(C), 200$ | $P_C, 210$ | | ||
| - | |||
| - | Slektives REDO: | ||
| - | ^ TA ^ Seite ^ Page LSN vs LSN ^ Änderungen in DB (Platte) ^ | ||
| - | | $T_1$ | $P_B$ | $0 < 20$ | $P_B, 20$ | | ||
| - | | $T_1$ | $P_E$ | $60 \not< 60$ | ||
| - | | $T_3$ | $P_E$ | $60 \not< 110$ | $P_E, 110$ | | ||
| - | |||
| - | UNDO: | ||
| - | ^ TA ^ Seite ^ PageLSN >= LSn | ||
| - | |||
| - | ===== Übung 6 ===== | ||
| - | ==== Aufgabe 2 ==== | ||
| - | === a) === | ||
| - | <code sql> | ||
| - | SELECT | ||
| - | s.Name | ||
| - | FROM | ||
| - | student s, | ||
| - | lehrveranstaltung v, | ||
| - | Dozent d, | ||
| - | Hoert h, | ||
| - | Haelt hl | ||
| - | WHERE | ||
| - | d.Titel = " | ||
| - | d.Name = " | ||
| - | v.LVType = " | ||
| - | s.MatrNr = h.MatrNr | ||
| - | h.LVNr = v.LVNr AND | ||
| - | hl.LVNr = v.LVNr AND | ||
| - | hl.DozNr = d.DozNr AND | ||
| - | </ | ||
| - | |||
| - | === b) === | ||
| - | * Selektionen nach unten Verschieben. | ||
| - | * Name & Titel nach unten zu Dozenten verschieben | ||
| - | * Vortragstyp " | ||
| - | * Kreuzproduktreihenfolge ändern | ||
| - | * Weniger Dozenten als LVs | ||
| - | * Weniger LVs als Studenten ... | ||
| - | |||
| - | === d) === | ||
| - | Anmerkung 1: Es bleiben genau die Tupel erhalten, für die gilt '' | ||
| - | |||
| - | Anmerkung 2: Die 10 Tupel nach '' | ||
| - | |||
| - | ===== Übung 7 ===== | ||
| - | ==== Aufgabe 1 ==== | ||
| - | === a) === | ||
| - | Jeder mit jedem | ||
| - | $|R| \cdot |S| = 10 \cdot 10 = 100$ | ||
| - | |||
| - | === b) === | ||
| - | Ein Pointer pro Vergleichssetz. | ||
| - | Bei <= wird auf der einen Seite weitergegangen. Bei > wird auf der anderen Seite weitergegangen. | ||
| - | Hierfür dürfen keine Duplikate in dem einen Set sein. | ||
| - | |||
| - | $18$ | ||
| - | |||
| - | === c) === | ||
| - | Hashfunktion h(x) = x mod 5 | ||
| - | |||
| - | ^ h(x) ^ Elemente aus R ^ Elemente aus S ^ Vergleiche ^ | ||
| - | | 0 | 10, | 5, 10 | $1 \cdot 2 = 2$ | | ||
| - | | 1 | 1, 6, 11 | 1, 6 | $3 \cdot 2 = 6$ | | ||
| - | | 2 | 2, 7, 12 | 2 | $3 \cdot 1 = 3$ | | ||
| - | | 3 | 3,13 | 3,8,13 | $2 \cdot 3 = 6$ | | ||
| - | | 4 | 9 | 4, 14 | $1 \cdot 2 = 2$ | | ||
| - | ^ Sum ^^^ $19$ ^ | ||
| - | |||
| - | Jeder wird mit jedem, aber nur innerhalb des Buckets verglichen. | ||
| - | |||
| - | $19$ | ||
| - | |||
| - | === d) === | ||
| - | Hashfunktion für Blockbildung: | ||
| - | |||
| - | ^ $h_B(x)$ ^ Elemente in R ^ Elemente in S ^ | ||
| - | | 0 | 3, 6, 9, 12 | 3, 6 | | ||
| - | | 1 | 1, 7, 10, 13 | 1, 4, 10, 13 | | ||
| - | | 2 | 2, 11 | 2, 5, 8, 14 | | ||
| - | |||
| - | Hashfunktion für Join: $h(x) = x mod 2$ (gerade und ungerade im Block miteinander Vergleichen) | ||
| - | |||
| - | $16$ | ||
| - | |||
| - | ==== Aufgabe 2 ==== | ||
| - | |C|-1 Blöcke | ||
| ===== ACID ===== | ===== ACID ===== | ||
| * Atomic (Wenn, dann wird man als ganzes abgebrochen) | * Atomic (Wenn, dann wird man als ganzes abgebrochen) | ||
| Line 434: | Line 8: | ||
| * Isolation (Man muss sich aleine fühlen) | * Isolation (Man muss sich aleine fühlen) | ||
| * Durability (Abgeschlossene Transaktionen sind von dauer) | * Durability (Abgeschlossene Transaktionen sind von dauer) | ||
| - | * | ||
| - | |||
uni/8/dbs2/start.1435669307.txt.gz · Last modified: (external edit)
