2017-01-12 2 views
0

Stellen Sie sich vor, wir haben 2 Knoten, die Geldtransfer durchführen. Knoten A initiiert eine Geldüberweisung von einem Konto zu einem anderen, und Knoten B ist dafür verantwortlich, diese Transaktion abzuschließen. Um diese Transaktion abzuschließen, muss der Knoten A daher eine Übertragungsanforderung an den Knoten B senden, und bei Erfolg muss der Knoten B mit der Bestätigung der Übertragungsanforderung antworten. Das mögliche Problem, das ich sehe, ist folgendes: Nach dem Empfang der TRANSFER-Anfrage hat der Knoten B die Transaktion ausgeführt, aber keine Antwort gesendet. Daher denkt Knoten A, dass die Anforderung fehlgeschlagen ist, und meldet ein Problem, aber Transaktion actully wurde abgeschlossen.Verteilte Transaktionsaggression

Auch 2-Phasen-Commit-Protokoll, wenn man bedenkt (wo der Knoten B auf dem Empfang von Übertragungsanforderung nicht Transaktion nicht begehen, sondern nur ausführen und für einige warten begehen Bestätigung vom Knoten A) dort ähnliches Problem sein kann: wenn Knoten A Senden einer TRANSFER-Commit-Anforderung, es kann nicht sicher sein, dass Knoten B diese Anforderung empfangen hat und die Transaktion tatsächlich abgeschlossen wurde (selbst wenn diese Anforderung an den Zielhost übermittelt wurde, können wir nicht sicher sein, dass sie von einem Prozess ausgeführt wurde).

Wie wird dieses Problem gelöst oder ist es wirklich ein Problem?

Antwort

0

Ich würde sagen, ja, es ist ein Problem, das angesprochen werden muss. Wenn die Übertragungsanforderung fehlschlägt, können Sie nicht sicher sein, ob sie bereits vom Knoten B verarbeitet wurde oder ob ein Fehler auftritt, bevor die Verarbeitung erfolgt (oder vor dem Zeitpunkt, zu dem die Anforderung an B übermittelt wurde).

Im Fall von 2PC wird durch Einführung der prepare phase gelöst. Die Datenverarbeitung wird zuerst durchgeführt, Änderungen sind jedoch für die Außenwelt erst sichtbar, wenn die Transaktion festgeschrieben wurde. Wenn der Fehler auftritt, bevor die Vorbereitung verarbeitet wird, wird die gesamte Transaktion abgebrochen. Wenn B dann beim Neustart abstürzt, gibt es keine Vorstellung von der Transaktion, so dass sie abgebrochen wird, wenn nur ein Verbindungsfehler vorliegt, dann werden B Transaktions-Timeouts schließlich und es wird abgebrochen. Wenn der Fehler nach der Vorbereitung der Verarbeitung auftritt, sollte die gesamte Arbeit für die Festschreibung erfolgen. Wenn die Kommunikation mit B fehlschlägt, muss der Transaktionsmanager (in regelmäßigen Abständen) versuchen, das B zu kontaktieren und die Transaktion am Ende zu beenden.