TU Wien:Datenbanksysteme VU (Skritek)/Zusammenfassung Test 2

Aus VoWi
Zur Navigation springen Zur Suche springen

Für den Stoff vom 1. Test, siehe hier.

Transaktionsverwaltung[Bearbeiten | Quelltext bearbeiten]

Transaktion
Eine Transaktion ist eine Folge von Datenbankoperationen welche die Datenbasis von einen konsistenten Zustand in einen anderen konsistenten Zustand überführen.
Eine Transaktion wird atomar (= (logisch) ununterbrechbar) ausgeführt, d.h.
  • als Einheit fehlerfrei ausgeführt, und
  • ohne Beeinflussung durch andere Transaktionen.

Operationen zur Datenverarbeitung:

  • read(A,a)
  • write(A,a)

Operationen zur Transaktionskontrolle:

  • BOT (begin of transaction)
  • commit
  • abort
Historie
beschreibt die Reihenfolge der elementaren Operationen bei einer verzahnten Ausführung mehrerer Transaktionen
ACID
  • Atomicity — Eine Transaktion ist die kleinste, nicht weiter zerlegbare Einheit.
  • Consistency — Eine Transaktion hinterlässt einen konsistenten Zustand der Datenbasis.
  • Isolation — Nebenläufig ausgeführte Transaktionen dürfen sich nicht beeinflussen.
  • Durability — Die Auswirkungen einer erfolgreich abgeschlossenen Transaktion gehen nicht mehr verloren.

Recovery[Bearbeiten | Quelltext bearbeiten]

Speicherverwaltung[Bearbeiten | Quelltext bearbeiten]

  • Speicher unterteilt in Seiten (Pages)
  • Datensätze werden auf Seiten abgebildet
    • Vereinfachte Annahme in LVA: Datum auf Seite

Kein Auslagern während eines Zugriffs (FIX).

Strategien zur Ersetzung von Pufferseiten:

  • steal: Von Transaktionen geänderte Seiten können ausgelagert werden, während die Transaktionen aktiv sind. → Hintergrundspeicher kann Änderungen nicht abgeschlossener Transaktionen enthalten → Recovery nach Verlust des Puffers benötigt globales Undo
  • ¬steal: Seiten die von einer noch aktiven Transaktion verändert wurden dürfen nicht ausgelagert werden.

Wenn eine Transaktion erfolgreich abschließt, kann die Auslagerung der geänderten Pufferseiten:

  • erzwungen werden (force)
  • nicht erzwungen werden (¬force) → dirty pages können im Puffer verbleiben → Recovery nach Verlust des Puffers benötigt globales Redo
Einbringstrategien
  • Update-in-Place: Jede Seite hat genau einen Platz im Hintergrundspeicher. Beim Auslagern wird eine Seite auf diesen Platz kopiert. Alter Zustand der Seite wird überschrieben.
  • Twin-Block-Verfahren: Für jede Seite zwei Kopien im Hintegrundspeicher + Bit das angibt welche Kopie aktuell ist. Beim Auslagern wird Seite auf aktuelle Kopie geschrieben.
  • Schattenspeicherkonzept: Nur für veränderte Seiten existieren zwei Kopien

Fehlerkategorien[Bearbeiten | Quelltext bearbeiten]

Lokaler Fehler
  • Nur eine Transaktion betroffen.
  • Durch diese Transaktion verursachte Änderungen müssen (schnell!) zurückgesetzt werden (Lokales Undo).
Fehler mit Verlust des DMBS-Puffers
  • Durch abgeschlossene Transaktionen verursachte Änderungen müssen erhalten bleiben (Globales Redo).
  • Durch nicht abgeschlossene Transaktionen verursachte Änderungen müssen zurückgesetzt werden (Globales Undo).
Fehler mit Hintegrundspeicherverlust
  • Wiederherstellung der Daten mittels Archivkopie

Angenommene Systemkonfiguration[Bearbeiten | Quelltext bearbeiten]

  • steal
  • ¬force
  • Update-In-Place
  • kleine Sperrgranulate auf Datensatzebene

Protokollierung (Logging)[Bearbeiten | Quelltext bearbeiten]

Strutkur eines Log-Eintrags
[LSN, TransaktionsID, BOT, 0]
[LSN, TransaktionsID, PageID, Redo, Undo, PrevLSN]
  • LSN (log sequence number)
eindeutige Kennung des Log-Eintrags, monoton aufsteigend

Wir unterscheiden zwischen:

  • Physische Protokollierung: Redo- und Undo-Einträge enthalten Zustände.
  • Logische Protokollierung: Redo- und Undo-Einträge enthalten Operationen.

In der Übung wird aus didaktischen Gründen die logische Protokollierung verwendet.

Jede Seite hat ein Feld für die LSN des jüngsten die Seite betreffenden Log-Eintrags, damit das DBMS beim Wiederanlauf erkennen kann ob die Auswirkung eines Log-Eintrags bereits auf der Seite vorhanden ist.

WAL-Prinzip (Write Ahead Log)
  • Bevor eine Transaktion festgeschrieben wird, müssen alle Log-Einträge der Transaktion ausgeschrieben werden (für Redo).
  • Bevor eine modifizierte Seite ausgelagert werden darf, müssen alle in zu dieser Seite gehörenden Log-Einträge ausgeschrieben werden (für Undo).
  • Die chronologische Reihenfolge muss beim Ausschreiben erhalten bleiben.

Wiederanlauf nach einem Fehler (Recovery)[Bearbeiten | Quelltext bearbeiten]

Wiederanlauf nach Fehler mit Verlust des Puffers[Bearbeiten | Quelltext bearbeiten]

Eine Transaktion muss entweder vollständig rekonstruiert werden (Winner) oder vollständig rückgängig gemacht werden (Loser).

Drei Phasen des Wiederanlaufs:

  1. Analyse: welche Transaktionen gibt es? Sind sie Winner oder Loser?
  2. Redo aller Änderungen (Winner und Loser)
  3. Undo aller Loser-Änderungen

Auch während des Wiederanlaufs kann ein Fehler mit Verlust des Puffers auftreten.

Realisierung:

  • Redo-Phase: mittels LSN
  • Undo-Phase: mittels CLRs (compensation log record)
Compensation Log Record (CLR)
<LSN, TransaktionsID, PageID, Redo, PrevLSN, UndoNxtLSN>

Wiederanlauf nach lokalem Fehler[Bearbeiten | Quelltext bearbeiten]

Wiederanlauf nach Fehler mit Hintergrundspeicherverlust[Bearbeiten | Quelltext bearbeiten]

Sicherungspunkte (Checkpoints)[Bearbeiten | Quelltext bearbeiten]

Mehrbenutzersynchronisation[Bearbeiten | Quelltext bearbeiten]

Nebenläufigkeit und mögliche Fehler[Bearbeiten | Quelltext bearbeiten]

Konflikt
  • zwei Transaktionen greifen auf das selbe Objekt zu
  • mindestens ein Zugriff ist schreibend
  • mögliche Konflikte: W-W, W-R, R-W

Mögliche Fehler bei unkontrollierter Nebenläufigkeit

  • Lost Update (W-W)
  • Dirty Read (W-R)
  • Unrepeatable Read (R-W)
  • Phantomproblem (R-W)

Klassifikation von Historien[Bearbeiten | Quelltext bearbeiten]

Historie
zeitliche Anordnung der elementaren Operationen einer Menge von Transaktionen
Konfliktoperationen
Paare von Operationen die auf das selbe Datenobjekt zugreifen, mindestens eine davon schreibend

Serialisierbarkeit[Bearbeiten | Quelltext bearbeiten]

Serielle Historie
Jede Transaktion wird vollständig abgearbeitet bevor die nächste beginnt.
Serialisierbare Historie
Eine (verzahnte) Historie welche den selben Effekt hat wie irgendeine serielle Ausführung (informell)
konfliktäquivalent
Zwei HIstorien (über der selben Menge an Transaktionen), wenn sie sämtliche Konfliktoperationen der nicht abgrebrochenen Transaktionen in der selben Reihenfolge ausführen.
Konfliktserialisierbare Historie
EIne Historie, wenn sie konfliktäquivalent zu einer seriellen Historie ist.

Weitere Eigenschaften bei abort[Bearbeiten | Quelltext bearbeiten]

Minimalanforderungen:

  • Konfliktserialisierbar
rücksetzbare Historien
Abbruch einer aktiven Transaktion möglich ohne Einfluss auf erfolgreich abgeschlossene Transaktionen
Eine Transaktion darf erst mit commit abschließen nachdem alle Transaktionen von denen sie gelesen hat ebenfalls abgeschlossen sind.

Zusätzliche Eigenschaften:

Historien ohne kaskadierendes Rücksetzen
Änderungen einer Transaktion werden erst nach einem commit zum Lesen freigegeben.
strikte Historien
Auf ein von einer Transaktion geschriebenes Datum dürfen andere Trasaktionen erst nach deren Beendigung (commit oder abort) schreibend oder lesend zugreifen.

Concurrency Control[Bearbeiten | Quelltext bearbeiten]

Sperrbasierte Synchronisation[Bearbeiten | Quelltext bearbeiten]

Zwei Sperrmodi
  • S ... shared, read lock
  • X ... exclusive, write lock
Zwei-Phasen-Sperrprotokoll (2PL)
Nachdem eine Transaktion eine Sperre freigegeben hat darf sie keine weiteren Sperren mehr anfordern -> Wachstumsphase und Schrumpfungsphase
Strenges Zwei-Phasen-Sperrprotokoll (strict 2PL)
Alle Sperren werden bis Transaktionsende gehalten. -> nur strikte Historien werden zugelassen
Deadlock-Erkennung
  • einfache Methode: Time-out Strategie
  • exakte Methode: Wartegraph
Deadlock-Vermeidung
  • Preclaiming (auch conservative 2PL): Transaktionen werden nur gestarted wenn alle benötigten Sperren bereits am Beginn gewährt werden können.
  • Zeitstempelverfahren
    • wound-wait: ältere brechen jüngere ab, jüngere warten
    • wait-die: ältere warten, jüngere brechen ab
Hierarchische Sperrgranulate (MGL)
  • Insert/Delete - Operationen
  • Weitere Synchronisationsmethoden
    • Zeitstempel-basierende Synchronisation
    • Optimistische Synchronisation

Transaktionsverwaltung in SQL[Bearbeiten | Quelltext bearbeiten]

PL/pgSQL[Bearbeiten | Quelltext bearbeiten]

User defined functions:

CREATE [OR REPLACE] FUNCTION
  name ([ [argname] argtype [, ...] ])
   [ RETURNS rettype
    |RETURNS TABLE (colname coltype [, ...])]
AS $$
...  eigentlicher Source Code
$$ LANGUAGE plpgsql;

PL/pgSQL Programme sind in Blöcken strukturiert:

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
[ EXCEPTION
  excpthandling ]
END [ label ];

Datenintegrität[Bearbeiten | Quelltext bearbeiten]

Integritätsbedingungen[Bearbeiten | Quelltext bearbeiten]

Hier geht es um semantische Integritätsbedingungen, die aus den Eigenschaften der modellierten Miniwelt abgeleitet werden.

  • statische Integritätsbedingungen (Bedingungen an Zustand der Datenbasis)
  • dynamische Integritätsbedingungen (Bedingungen an Zustandsänderungen in der Datenbank)
Statische Integritätsbedingungen in SQL
  • unique(...)
  • primary key(...)
  • foreign key(...)
  • not null
  • default

check (...): Änderungen auf einer Tabelle werden nur zugelassen, wenn check zu true auswertet

Referentielle Integrität[Bearbeiten | Quelltext bearbeiten]

  • primary key(...)
  • foreign key(...)
  • references tabelle

Einhaltung der Referenziellen Integrität bei Updates, Löschen:

  • on update {no action | cascade | set null | set default}
  • on delete {no action | cascade | set null | set default}
Zyklische Abhängigkeiten
  • ALTER TABLE zum foreign key anlegen
  • DEFERRED um neue Tupel einzufügen.
  • Löschen von Tabellen mit DROP CONSTRAINT oder CASCADE.

Trigger[Bearbeiten | Quelltext bearbeiten]

CREATE TRIGGER name { BEFORE | AFTER}
  {INSERT | UPDATE | DELETE}
  ON table name
  [ REFERENCING { { OLD | NEW } TABLE
                [ AS ] trans name } ]
  [ FOR [ EACH ] { ROW | STATEMENT } ]
  [ WHEN ( condition ) ]
  EXECUTE PROCEDURE function_n ( arguments )

Die Funktion darf keine Argumente haben und muss den Rückgabe ert trigger haben:

CREATE FUNCTION name() RETURNS trigger
 AS $$ ... $$ LANGUAGE plpgsql;

Bei Per-ROW Before Triggern stehen spezielle Variablen zur Verfügung:

  • INSERT: NEW enthält neue Zeile
  • UPDATE: OLD und NEW sind definiert
  • DELETE: OLD enthält die zu löschende Zeile

Bei einer Rückgabe von NULL wird die Verarbeitung der Zeile abgebrochen. Sonst Verarbeitung wird mit zurückgegebenen Wert fortgesetzt.

SQL-Vertiefung[Bearbeiten | Quelltext bearbeiten]

Rekursive Abfragen
WITH RECURSIVE tabName(AttrListe) AS (
    Nicht rekursiver Abschnitt
  UNION [ ALL ]
    Rekursiver Abschnitt
)
SELECT ... FROM tabName;
Sichten (Views)

Gespeicherte Anfragen, die als virtuelle Tabelle zur Verfügung stehen.

CREATE VIEW name AS
SELECT ...
Window Functions
Sequences
CREATE SEQUENCE name
[INCREMENT [ BY ] increment]
[MINVALUE minvalue | NO MINVALUE]
[MAXVALUE maxvalue | NO MAXVALUE]
[START [WITH] start] [CACHE cache]
[[NO] CYCLE]

Zugriff mit:

  • nextval(sname)
  • currval(sname)
  • setval(sname, val)
Weitere Datentypen und built-in Funktionen
CREATE TYPE Rang AS ENUM ('C2', 'C3', 'C4');