Bedeutet optimistische Parallelität pro Objekt Serialisierbarkeit, wenn eine Transaktion niemals mehrere Objekte umfasst?


13

Bei einem System, das Folgendes bietet:

  • Optimistische Parallelitätskontrolle / Versionierung pro Objekt (mit CAS - Check-and-Set)
  • Transaktionen, die nie mehr als ein einzelnes Objekt umfassen müssen.
  • Schnappschuss-Isolierung

Wird dieses System als serialisierbar angesehen ?

Von der Snapshot-Isolierung

Bei einer Schreibversatzanomalie lesen zwei Transaktionen (T1 und T2) gleichzeitig einen überlappenden Datensatz (z. B. Werte V1 und V2), führen gleichzeitig disjunkte Aktualisierungen durch (z. B. T1-Aktualisierungen V1, T2-Aktualisierungen V2) und schreiben schließlich gleichzeitig fest, was beide nicht gesehen haben das Update vom anderen durchgeführt. Wäre das System serialisierbar, wäre eine solche Anomalie unmöglich, da entweder T1 oder T2 "zuerst" auftreten und für den anderen sichtbar sein müssten. Im Gegensatz dazu ermöglicht die Snapshot-Isolation Abweichungen beim Schreiben.

Stellen Sie sich als konkretes Beispiel vor, dass V1 und V2 zwei Salden sind, die von einer einzelnen Person, Phil, gehalten werden. Die Bank lässt zu, dass entweder V1 oder V2 ein Defizit aufweisen, vorausgesetzt, die in beiden gehaltene Summe ist niemals negativ (dh V1 + V2 ≥ 0). Beide Guthaben betragen derzeit 100 USD. Phil initiiert zwei Transaktionen gleichzeitig, wobei T1 200 USD von V1 und T2 200 USD von V2 abzieht.

Auf dieser Grundlage scheint das Potenzial für Schreibverzerrungen der einzige Grund für ein System zu sein, das garantiert, dass die Snapshot-Isolation nicht serialisierbar ist.

In einem System, in dem eine Transaktion nicht mehrere Objekte umfassen kann (im obigen Beispiel V1 und V2), scheint es jedoch unmöglich zu sein, dass ein Schreibversatz auftritt.

Daher ist das oben beschriebene System serialisierbar. Ist das richtig?


1
Ich denke, die Antwort lautet "Ja", mit der Maßgabe, dass die Datenbank Transaktionen abbrechen darf, die andernfalls zu einem Schreibversatz führen würden. Wenn die Transaktionen auf das Lesen / Schreiben eines einzelnen Objekts beschränkt sind, sind sie entweder disjunkt oder kollidieren.
pjc50

2
Ich denke, Sie brauchen auch eine Möglichkeit, um doppelte Datensätze für ein erstes Commit zu verhindern. In diesem Fall konnten zwei optimistische Schreiber jeweils einen leeren Schnappschuss sehen und feststellen, dass der Datensatz neu war, sodass Sie zwei Objekte mit jeweils Version 0 haben konnten.
Matthew Mark Miller,

Antworten:


1

Nein, ich glaube nicht, dass Ihre Bestimmungen zu einem System führen, das wir als serialisierbar betrachten sollten.

Die Snapshot-Isolation ist eine Technik, mit der sichergestellt wird, dass eine Transaktion über die gesamte Transaktion denselben Datensatz sieht. Die Snapshot-Isolation bietet einige Garantien, definiert jedoch nicht alle Merkmale, die zum Verständnis der tatsächlichen Funktionsweise von Transaktionen erforderlich sind (es sei denn, wir kombinieren Snapshot-Isolation und MVCC).

Die Snapshot-Isolation wird am häufigsten mit MVCC (Multi Version Consistency Control) implementiert. MVCC definiert mehr Details von Transaktionen im Kontext ihrer Snapshots: Es heißt, dass sie nur dann isoliert werden müssen, wenn Schreibkonflikte auftreten (nur Standorte oder Standorte + Werte, abhängig von der Implementierung). MVCC bietet ein entspanntes Konsistenzmodell und leidet unter einer Schreibverzerrung.

Entspannte Konsistenzmodelle sind schwer zu verstehen, da sie wie eine Mischung aus Nichtisolation und vollständiger Isolation sind.

Beginnen wir also zunächst mit einem strengen Modell der Parallelität. Zwei Transaktionen müssen voneinander isoliert werden, wenn eine in Daten schreibt, die die andere liest oder schreibt (und umgekehrt ...).

Wenn wir nicht wissen, warum eine Transaktion Daten liest, müssen wir davon ausgehen, dass ein anderer gelesener Wert das Verhalten des betreffenden Clients verändern kann. Aus diesem Grund weist die Bedingung überlappender Transaktionen auf eine Isolation hin. Ohne Isolation kann ein Lesevorgang veralteter Daten in einem Snapshot leicht zu einer lockeren Konsistenz führen. Ein weiterer Begriff ist Inkonsistenz, dh Fehler.

Wir müssen nur die genauen Daten berücksichtigen, die von den Transaktionen gelesen oder geschrieben wurden. Alle Daten außerhalb dieses Satzes müssen nicht berücksichtigt werden. Es ist jedoch wichtig zu wissen, dass, wenn es sich um Daten handelt, die von einer Transaktion gelesen werden, alle "Metadaten" (sowie Daten und Metadaten, die von Metaoperationen wie der Überprüfung von Einschränkungen gelesen werden) einbezogen werden müssen. Beispiele für Metadaten sind / Metaoperationen: Identifizierung eines eindeutigen neuen Primärschlüssels; ein anderer ist die Summe einer ganzen Spalte; eine andere ist, nach etwas zu suchen und es nicht zu finden; Bereichssuchen oder Summen. Dies geht auf @ Matthews Kommentar zur Vermeidung von Duplikaten sowie auf die Antwort von @ Tersosauros zurück, in der er den Zustand betrachtet.

Dies bedeutet beispielsweise, dass sich zwei Transaktionen überlappen (eine Isolation erfordern), wenn beide eine Zeile einfügen (unter der Annahme einer eindeutigen Primärschlüsseleinschränkung), da das Überprüfen der Schlüsseleinschränkung gleichbedeutend mit dem Lesen der gesamten Primärschlüsselspalte ist. Als weiteres Beispiel ist das Suchen und Finden eines Werts das Lesen eines Werts, das Nicht-Finden eines Werts jedoch das Betrachten jedes Werts in der Spalte.

MVCC schützt nur vor überlappenden oder widersprüchlichen Schreibvorgängen, schützt jedoch nicht vor Lesevorgängen (sofern diese nicht auch von dieser Transaktion geschrieben wurden). Um einen Konsistenzfehler in MVCC zu erhalten, müssen wir lediglich etwas lesen, das von einer anderen Transaktion geändert wurde (wobei die andere Transaktion nach dem Abrufen des Snapshots des ersteren erfolgt, aber zuerst festgeschrieben wird), während die andere Transaktion weiterhin veraltete Daten und verwendet Entscheidungen werden basierend auf diesen veralteten Daten anders getroffen als bei den aktuellen Daten. Es ist einfacher zu verursachen als man denkt.

Entspannte Konsistenz ist eine andere Möglichkeit, potenziell inkonsistente oder fehleranfällige Aussagen zu machen. (Entspannte Konsistenz sollte nicht mit eventueller Konsistenz verwechselt werden. Dies ist eine andere beliebte Form von Fehlern, die von "NoSQL" abweicht.)

Wenn Sie in Ihrer Frage sagen, dass Transaktionen niemals mehr als ein Objekt umfassen müssen, muss dies sowohl für Lese- und Schreibvorgänge als auch für Metadaten (und Metaoperationen) gelten, einschließlich Konsistenzprüfung, Aggregation ganzer Spalten, Abwesenheitsprüfung, Bereichssuche usw. .: wenn ja, dann soweit so gut.

Jedoch...

Ich gehe von Ihrer Frage aus, dass Sie die Momentaufnahme-Isolierung (MVCC) für einzelne Objekte verwenden (z. B. anstelle der Objektsperrung). (Sie erwähnen auch CAS; ich habe von Compare-and-Swap und Test-and-Set gehört, aber nicht von Check-and-Set, obwohl ich annehme, dass es ähnlich ist).

Ihre Frage schreibt mir vor, dass "Objekte" mehr als ein Feld haben, sonst wären die Bestimmungen der Frage unnötig.

Da Ihre mit Snapshots / MVCC behandelten Objekte mehr als ein Feld haben, neigen Sie dazu, Schrägstellungen innerhalb einzelner Objekte zu schreiben. Wenn zwei Transaktionen gleichzeitig dasselbe Objekt aktualisieren, kann ein Feld des Objektwerts gelesen werden, der durch eine gleichzeitige andere Transaktion für dasselbe Objekt veraltet ist, und der Vorgang kann fortgesetzt werden, ohne die potenzielle Inkonsistenz (auch als Fehler bezeichnet) zu kennen.

Sie könnten stattdessen die Objektsperre verwenden, um zu verhindern, dass zwei Transaktionen (für die Aktualisierung) dasselbe Objekt betrachten, wenn bereits eine andere Transaktion dabei ist.

Ich glaube, dass eine alternative Form der Snapshot-Isolation ohne die Verwendung des MVCC-Vergleichsmodells "Nur Schreibsatz" möglich ist. Sie können den Vergleichssatz (algorithmisch) von "Nur Schreiben" heraufstufen, um auch den Lesesatz einzuschließen. Dann können zwei Transaktionen, die dasselbe Objekt aktualisieren, keine Schreibverzerrung verursachen (da diejenige, die später festgeschrieben wird, abgebrochen wird). Ich denke, dies ist möglicherweise die geeignete Lösung für das von Ihnen beschriebene Problem, da Sie bereits den größten Nutzen für MVCC erzielen, indem Sie Transaktionen mit mehreren Objekten ausschließen.

(Wir müssen nur die genauen und spezifischen gelesenen oder geschriebenen Elemente / Felder berücksichtigen, aber die gelesenen Elemente / Felder müssen als Metadaten einbezogen werden, möglicherweise während Metaoperationen, um eine Schreibverzerrung (dh einen Fehler) zu verhindern. Wenn wir einen der Lesesätze aus dem Vergleichssatz entfernen Wenn wir Metadaten (die möglicherweise von Metaoperationen verwendet werden) nicht berücksichtigen, verfügen wir über ein Modell, das Fehler zulässt.)


0

Ich denke, wie @ pjc50 feststellte, (Hervorhebung hinzugefügt :) " Wenn die Transaktionen auf das Lesen / Schreiben eines einzelnen Objekts beschränkt sind", lautet die Antwort "Ja". Ich denke jedoch, dass dies auf die Idee eines einzelnen Objekts zurückzuführen ist.

In dem Beispiel aus der Snapshot-Isolation haben T1 und T2 keinen gemeinsamen Wert. Es besteht jedoch weiterhin die Möglichkeit eines Schreibversatzes, da " keiner die Aktualisierung durch die andere Quelle gesehen hat " . Daher ist es die Fähigkeit einer Transaktion, alle anderen Aktualisierungen vor dem Festschreiben zu sehen , die eine Transaktion wirklich serialisierbar macht.

Aus Serialisierbarkeit :

Serialisierbarkeit eines Zeitplans bedeutet Äquivalenz (im Ergebnis des Datenbankstatus, der Datenwerte) zu einem seriellen Zeitplan (dh sequentiell ohne zeitliche Überschneidung von Transaktionen) mit denselben Transaktionen.

Leider müssen wir aus diesem Grund (und wie @Matthew Mark Miller betont ) sowohl den Zustand als auch die Werte berücksichtigen . Mit dieser Überlegung könnten zwei Transaktionen, die OCC verwenden , bei jedem Schreiben eines Datenbankzustands einen Schreibversatz aufweisen .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.