Scheduler (Datenbank)

Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 23. Mai 2006 um 18:12 Uhr durch Panra (Diskussion | Beiträge) (Verlinkung und ausführlicher). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Ein (Datenbank-)Scheduler dient der Verwaltung von Schreib- und Lesezugriffen (sog. Operationen auf Datenbankobjekten. Er sorgt dafür, dass keine Konflikte während der parallelen Ausführung nebenläufiger Transaktionen auftreten. (Transaktionen werden nach Möglichkeit parallel auszuführen, um die Systemressourcen optimal ausnutzen zu können und die Transaktionen nicht seriell, d.h. nacheinander ausführen zu müssen. Dies kommt besonders bei Mehrbenutzerdatenbanken zum tragen.)

Der Scheduler ist die Komponente eines DBMS, welche Schedules so konstruiert, dass sie einem bestimmten Protokoll gehorchen. Außerdem überdimmt ein Scheduler die Ablaufkontrolle. Dabei hat er die Möglichkeit eine Operation sofort auszuführen (d.h. an den Datenverwalter weitergeben), sie zu verzögern (meist realisiert über eine Warteschlange) oder sie zurückzuweisen (durch Abbruch / abort der zugehörigen Transaktion).

Ein Scheduler muss folgende Eigenschaften eines Schedules sicherstellen:

  • Serialisierbarkeit
  • Fehlersicherheit

Serialisierbarkeit

In einem seriellen Schedule werden die enthaltenen Transaktionen strikt nacheinander ausgeführt. Ein serieller Schedule ist damit immer korrekt, weil keine Überschneidungen auftreten können. Allerdings ist ein serieller Schedule auch verhältnismäßig ineffizient, weil eine Transaktion immer die Beendigung der anderen Transaktion abwarten muss und damit keine Parallelisierung ausgenutzt werden kann.

Ein Schedule wird als serialisierbar bezeichnet, wenn er äquivalent zu einem seriellen Schedule ist. Es gibt dabei folgende Äquivalenzklassen:

Schedules sind final-state-äqivalent, wenn ihre Operationen ausgehend von einem gleichen Anfangszustand den gleichen Endzustand erzeugen. Dabei wird die globale Konsistenz nach Ausführung aller beteiligter Transaktionen betrachtet.
FSR (final state serializability) ist die Klasse aller final-state-serialisierbaren Historien.

Schedules sind sichten-äquivalent, wenn alle Transaktionen den gleichen Datenbank-Zustand 'sehen', d.h. wenn gilt: Transaktionen lesen gleiche Werte   sie produzieren das gleiche Ergebnis. Es wird also sowohl die globale Konsistenz nach Ausführung aller beteiligten Transaktionen als auch die lokale Konsistenz nach Ausführung jeder einzelnen Transaktion betrachtet.
VSR (view serializability) ist die Klasse aller sichten-serialisierbaren Historien.

CSR (conflict serializability) ist die Klasse aller konflikt-serialisierbaren Historien.

CMFSR (commit final state serializability) ist die Klasse aller commit-final-state-serialisierbaren Historien.


CMVSR (commit view serializability) ist die Klasse aller commit-view-serialisierbaren Historien.


CMCSR (commit conflict serializability) ist die Klasse aller commit-conflict-serialisierbaren Historien.

Fehlersicherheit

Fehlersicherheit eines Schedules ist die Eigenschaft, dass dieser Schedule sich bei Abbruch einer oder mehreren Transaktionen genauso verhält wie ein ähnlicher Schedule, der ausschließlich die nicht abgebrochenen Transaktionen enthält.

Es gibt folgende Klassen von Schedules bzgl. der Fehlersicherheit:

  • RC - recoverable. Es ist möglich nach einer abgebrochenen Transaktion die Verarbeitung der restlichen Schedules weiterzuführen ohne Inkonsistenzen zu erhalten.
  • ACA - avoids cascading abort. Geschachtelte Abbrüche werden vermieden indem Transaktionen nur von abgeschlossenen Transaktionen lesen dürfen.
  • ST - strict schedules.
  • RG - rigorous schedules.

Klassifikation und Protokolle

Scheduler können in folgende Klassen eingeteilt werden:

  • Pessimistische / konservative Scheduler. Diese Scheduler versuchen Konflikte zwischen Operationen nebenläufiger Transaktionen während ihrer Ausführung zu erkennen bzw. zu beheben. Sie bevorzugen die Verzögerung von Operationen bei Konflikten.
    • Sperrende Scheduler (Locking Scheduler) - Die o.g. Kriterien werden durch Locks (Sperren) erreicht.
      • 2PL - Two-Phase-Locking. Jede Transaktion teilt sich ein zwei Phasen. In der ersten dürfen Locks nur angefordert werden und in der zweiten Phase dürfen diese nur freigegeben werden. Es ist also einer Transaktion nicht erlaubt nach der Freigabe eines Datenelements einen neuen Lock darauf anzufordern. Die ausgegebenen Schedules sind CSR.
        • C2PL - conservative 2PL. Hier werden grundsätzlich beim Start jeder Transaktion alle Locks angefordert.
        • S2PL - strict 2PL. Sämtliche angeforderten Write Locks werden erst beim Abschluss der Transaktion freigegeben. Es kann bewiesen werden, dass solche Schedules zusätzlich zu CSR auch ST sind.
        • SS2PL - strong 2PL.
      • Baum-Sperrprotokolle. Wie 2PL, nur speziell für Bäume unter Ausnutzung deren besonderer Eigenarten.
        • WTL - write only tree locking
        • RWTL - read write tree locking
        • MGL - multiple granularity locking. Die Datenbankobjekte werden in einem Baum hierarchisch organisiert. An oberster Stelle steht z.B. die Datenbank, darunter Tabellen und weiter unten Tupel. Um an unterer Stelle ein Lock zu erhalten muss an den darüber liegenden Knoten mindestens ein ebensolches Lock bereits existieren. Beim Freigeben ist dies genau umgekehrt. MGL-produzierte Schedules sind CSR.
    • Nicht-sperrende Scheduler (non-locking)
      • TO - Zeitstempel-Verfahren (time ordering). Um Synchronisationsprobleme zu vermeiden, werden Zeitstempel für jede Transaktion vergeben sobald ihre jeweils erste Operation beim Scheduler eingeht. Zwei Strategien sind zu unterscheiden: wait-die und wound-wait
        • BTO - Basis-TO. Einfache und agressive Implementierung von TO. Operationen werden hier direkt an den Datenverwalter weitergeleitet und Transaktionen zu spät kommender Operationen abgebrochen.
      • SGT - Serialisierungsgraph-Tester
      • Generische Prüfung
  • Optimistische / agressive Scheduler. Diese Schuduler verschieben die Konfliktprüfung durch einen sog. Certifier auf den Commit-Zeitpunkt einer Transaktion. Sie führen eine Transaktion in drei Phasen aus: Read Phase (Operationen werden ausgeführt, Schreibzugriffe erfolgen ausschließlich im transienten lokalen Arbeitsbereich), Validation Phase (beim Commit wird die Transaktion durch Certifier validiert), Write Phase (Inhalt des transienten lokalen Arbeitsbereiches wird in die persistente Datenbasis übertragen. Validation Phase und Write Phase sind ununterbrechbar, werden also immer ohne Unterbrechung ausgeführt.
    • BOCC - backward oriented optimistic concurrency control.
    • FOCC - forward oriented optimistic concurrency control.
  • Hybride Scheduler. Sie verteilen die Konfliktprüfung auf mehrere Komponenten, die unterschiedliche Protokolle verwenden können.
    • Unterscheidung nach Konfliktart (read-write- / write-write-Konflikt)
    • Unterteilung der Datenelemente in diskjunkte Teilmengen
    • Unterteilung der Datenelemente nach ihrem Zugriffsmuster

Darüber hinaus gibt es noch Mehrversionen-Scheduler, welche zu jedem geschriebenen Datenelement mehrere Versionen speichern können, um Inconsistent Reads zu vermeiden. Ein Mehrversionen-Scheduler muss zusätzlich zum und abhängig vom umgesetzten Protokoll einer Lese-Operationen eine bestimmte Version des gelesenen Datenelementes zuweisen. Eine Schreib-Operation erzeugt normalerweise eine neue Version des jeweiligen Datenelements. Mehrversionen-Protokolle sind MVTO, MV2PL, MVSGT, ROMV (read only mulitiversion protocol).