====== Zusammenfassung ====== Die Mega-Übersicht Synchronisation Pessimistische Synchronisation mit Sperren Sperrprotokolle 2PL [deadlocks] Konservatives 2PL Striktes 2PL [deadlocks] Konservatives + Striktes 2PL Sperrverfahren RX RUX RAX RIX RAC Deadlocks Vermeiden [konservatives 2PL/precaiming] Erkennen Wartegraph Time-Out wound-wait wait-die Pessimistische Synchronisation mit Zeitstempeln Optimistische Synchronisation mit Zeitstempeln BOCC BOCC+ FOCC * [[Synchronisation]] ===== Grundbegriffe ===== ==== Anforderungen (Codd) ==== * **Integration** //einheitlicher// Zugriff auf //alle// Daten einer Anwendung * **Operationen** auf den Daten (ändern, löschen, ...) * **Data Dictionary** Schema anschauen * **Benutzersicheten** views * **Konsistenzüberwachung** bei Änderung * **Zugriffskontrolle** * **Transaktionen** * **Synchronisation** (Mehrbenutzersystem) ==== Ebenen ==== | Anwendungen (mehrere) || ^ Externe Ebene | Views (mehrere) | ^ | ↓↓ Logische Datenunabhängigkeit ↓↓ | ^ Konzeptionelle Ebene | | ^ | ↓↓ Physische Datenunabhängigkeit ↓↓ | ^ Interne Ebene | Speicherformat | ==== ACID ==== * Atomic (Wenn, dann wird man als ganzes abgebrochen) * Consistency (Konsistenter Zystand -> Konsistenter Zustand) * Isolation (Man muss sich aleine fühlen) * Durability (Abgeschlossene Transaktionen sind von dauer) ==== Serialisierungs-Graph ==== ^ x ^ y ^ z | <- Attribute | | $r_1$ | $w_2$ | $r_1$ | <- $\text{Operation}_\text{Transaktion}$ | | $r_2$ | $r_3$ | $w_1$ | ::: | | $w_2$ | $w_3$ | $r_4$ | ::: | | | | $w_3$ | ::: | Spaltenweise von oben nach unten die $wr(x), rw(x), ww(x)$-Paare finden ==== Anomalien ==== === Lost update === ^ t1 | r(x) | | w(x) | ^ t2 | | w(x) | | === Dirty read/write === ^ t1 | w(x) | | w(x) | ^ t2 | | r(x) | | === Non-repeatable read === ^ t1 | r(x) | | r(x) | ^ t2 | | w(x) | | === Phantom-Problem === //Non-repeatable read// mit Aggregiertem read ==== Eigenschaften von Schedules ==== Eigenschaften eines Schedules: ^ Schedule ^ Beschreibung ^ | allgemein | Durcheinander | | seriell | Blockform | | serialisierbar | allgemein + seriell (Zyklenfrei) | | rücksetzbar | ''commit'' erst nach ''commit'' von denen ich gelesen habe | | ohne kaskadiertes \\ Rollback | Keine Daten einer laufenden TA lesen | | strikt | Keine Daten einer laufenden TA lesen/schreiben | Eigenschaften zwischen Schedules: ^ Schedule ^ Beschreibung ^ | konfliktäquivalent | Gleiche Abhängigkeitsmengen | ===== Integrität ===== * Schlüssel-~ * Referenzielle ~ * Multiplititäten Constraints * Allgemeine Constraints ===== Datenschutz ===== ==== Discretionary Access Controll (DAC) ==== Explizite Autorisierung:
//Subjekt// bekommt //Zugriffsrecht// auf //Objekt//
grant ... on ... to ... ==== Verfeinertes DAC ==== Implizite Autorisierung: * //starke// Autorisierung überschreibt //schwache// Autorisierung * Es gibt //positive// und //negative// Autorisierung * Subjekte, Objekte und Operationen haben eine Hierarchie * Implizite Weitergabe positiver Autorisierung in die eine Richtung * Implizite Weitergabe negativer Autorisierung in die andere Richtung ==== Mandatory Access Control (MAC) ==== * Sicherheitsklassen für //Subjekte// und //Objekte// * Objekte hochstufen (V) * Objekte runter stufen (X) * Zugriff wenn ''class(S) >= class(O)'' * Angelegte Objekte ''class(S) =< class(O)'' ===== HW ===== B+ * Directory/Index Seiten * Datenseiten * **Sequenziell** \\ $t_\text{scan} = t_\text{seek} + f \cdot t_\text{transfer} + \lceil \frac{f}{c_\text{puffer}} \rceil \cdot t_\text{lat}$ * **Wahlfrei** \\ $t_\text{random} = (t_\text{seek} + c_\text{index} \cdot t_\text{transfer} + t_\text{lat}) \cdot a$ ===== Anfrageoptimierung ===== ==== Arten ==== * **Logische Anfrageoptimierung** \\ Auswertungsplan umbauen * **Physische Anfrageoptimierung** \\ Algorithmen auswählen ==== Logische Anfrageoptimierung ==== === Umformungsregeln === * $R \bowtie S = S \bowtie S$ * $R \cup S = S \cup R$ * $R \cap S = S \cap R$ * $R \times S = S \times R$ * $(R \bowtie S) \bowtie T = R \bowtie (S \bowtie T)$ * $(R \cup S) \cup T = R \cup (S \cup T)$ * $(R \cap S) \cap T = R \cap (S \cap T)$ * $(R \times S) \times T = R \times (S \times T)$ * $\sigma_A(\sigma_B(R)) = \sigma_B(\sigma_A(R))$ * $\sigma_{A \wedge B}(R) = \sigma_A(\sigma_B(R))$ * $\pi_A(\pi_B(R)) = \pi_A(R) \text{ mit } A \subseteq B$ * $\pi_A(\sigma_B(R)) = \sigma_B(\pi_A(R)) \text{ mit attr}(B) \subseteq A$ * $\sigma_B(R \bowtie S) = \sigma_B(R) \bowtie S \text{ mit attr}(B) \subseteq \text{ attr}(R)$ * $\sigma_B(R \times S) = \sigma_B(R) \times S \text{ mit attr}(B) \subseteq \text{ attr}(R)$ * $\sigma_B(R \cup S) = \sigma_B(R) \cup \sigma_B(S)$ * $\sigma_B(R \cap S) = \sigma_B(R) \cap \sigma_B(S)$ * $\sigma_B(R \setminus S) = \sigma_B(R) \setminus \sigma_B(S)$ * $\pi_B(R \cup S) = \pi_B(R) \cup \pi_B(S)$ * $\sigma_{A=B}(R \times S) = R \bowtie_{A=B} S$ === Algo === - $\sigma$ splitten - $\sigma$ nach unten - $\sigma$ und $\times$ => $\bowtie$ - $\pi$ einfügen, um auf minimum beschränken - $\pi$ nach unten - $\sigma$ mergen ===== Big Data ===== * high-**volume** * high-**velocity** * high-**variety** ==== Map-Reduce ==== - **Map** \\ Data => KV-Pair - **Shuffle** \\ Same key to same node - **Reduce** \\ Marge Values per Key ==== Zählanfrage auf unsicheren Daten ==== $F = (1 - P(A) + x \cdot P(A)) \cdot \ldots$ ==== Data Warehouse ==== | OLTP | OLAP | | Online Transaction Processing | Online Analytical Processing | | Detail | Nur relevante | | Aktuelle | Historische | | Ist eine quelle | Hat viele quellen | | Veränderbar | Nur hinzufügen |
//Fakten// in //hierachischen// //Dimensionen//
=== Relationales mapping === Faktentabelle in der Mitte == Snowflake == Eine Tabelle pro Hierachieebene pro Dimension == Star == Eine Tabelle pro Dimension ===== Recovery ===== ==== Fehlerarten ==== * Transaktionsfehler => Rücksetzen * Lokales UNDO * Systemfehler => Warmstart * Globales UNDO * Globales REDO * Medienfehler => Geräte-Recovery * Globales REDO ==== Logging ==== * Physisch [Bit-Blöcke] * Übergangslogging [XOR] * Zustandslogging [Volle ...] * Seiten-Logging [... Seiten] * Eintrags-Logging [... Einträge] * Logisches Logging [Befehle/Parameter loggen] * Physiologisches Logging [Befehle/Parameter pro Seite] === Aufbau Log-File === Ringbuffer * LSN (Fortlaufende Nummer) * TA-ID (Welche Transaktion) * Page-ID (Welche Seite) * REDO * UNDO * PrevLSN Log-Granularität $<=$ Sperrgranularität === Einbringungsstrategie (wo in DB) === * Direkt (NonAtomic, Update in-place) => UNDO nötig * Indirektes Einbringen (Atomic) ["Daneben ablegen"] => Kein UNDO nötig === Verdrängungsstrategien (wann frühestens Puffer -> DB) === * No-Steal [Nach COMMIT] => Kein UNDO * Steal [egal] => UNDO WAL-Prinzip: UNDO muss vor Änderungen an DB im Log stehen === Ausschreibungsstrategie (wann spätestens Puffer -> DB) === * Force [Vor COMMIT] => Kein REDO * No-Force [egal] => REDO COMMIT-Regel: REDO muss vor COMMIT im Log stehen ==== Sicherungen ==== === Arten === * TOC: Sicherung //einer// TA (entspricht Force) * TCC: Alle Änderungen raus schreiben, derweil keine //TA//. * ACC: Alle Änderungen raus schreiben, derweil keine //Operation//. === Ablauf === | 1. Analyse | Gewinner/Verlierer Bestimmen || | 2. REDO | Vollständiges REDO | Gewinner REDO | | 3. UNDO | UNDO (damals) laufender TAs | UNDO verlierer TA | | 4. Abschluss | Sicherungspunkt erstellen || * Gewinner => COMMIT im log * Verlierer => Rest