Atomare Updates über Chaincodes und Kanäle durchführen
Mit atomaren Transaktionen können Sie mehrere Transaktionen über Kanäle und Chaincodes hinweg atomar abschließen.
Eine atomare Transaktion ist eine unteilbare Reihe von Datenoperationen, die entweder alle erfolgreich oder keine erfolgreich sind.
Atomare Transaktionen können in komplexen Situationen nützlich sein, in denen mehrere Chaincodes auf separaten Kanälen bereitgestellt werden. Sie können atomare Transaktionen verwenden, um die Datenkonsistenz bei der Ausführung mehrerer Blockchain-Transaktionen aufrechtzuerhalten, selbst wenn ein Netzwerk- oder Systemfehler auftritt. Oracle Blockchain Platform unterstützt atomare Transaktionen mit dem Zwei-Phasen-Commit-Protokoll, wobei eine Anfangsphase, in der jeder Datenvorgang vorbereitet wird, von einer Phase gefolgt wird, in der jeder Datenvorgang tatsächlich festgeschrieben wird.
restproxy/api/v2/atomicTransactions
Jede atomare Transaktion besteht aus zwei oder mehr Blockchain-Transaktionen. Das Ergebnis (der Wert returnCode) der atomaren Transaktion ist entweder Success oder Failure. In einer atomaren Transaktion wird jede angeforderte Blockchain-Transaktion in zwei verschiedene Vorgänge aufgeteilt: eine Vorbereitungsphase und dann entweder eine Commit- oder eine Rollback-Phase.
- In der Vorbereitungsphase wird jede Transaktion wie gewohnt übernommen, aber anstatt abgeschlossen zu werden, werden die Änderungen zwischengespeichert und die Werte gesperrt, um zu verhindern, dass andere Transaktionen die zwischengespeicherten Werte ändern.
- Wenn die Vorbereitungsphase für jede Blockchain-Transaktion erfolgreich ist, werden die Transaktionen mit dem integrierten Chaincode bestätigt und festgeschrieben. Die zuvor gesperrten Werte werden entsperrt, und das Ergebnis der atomaren Transaktion ist
Success. - Wenn die Vorbereitungsphase für eine Blockchain-Transaktion fehlschlägt, werden alle anderen Transaktionen, bei denen die Vorbereitungsphase erfolgreich war, erneut mit dem integrierten Chaincode zurückgesetzt. Die zwischengespeicherten Änderungen werden entfernt, und die zuvor gesperrten Werte werden entsperrt. Das Ergebnis der atomaren Transaktion ist
Failure.
- Eine atomare Transaktion befindet sich noch in der vorbereiteten Phase, und eine andere Transaktion versucht, einen Schlüssel zu ändern, der von der vorbereiteten Transaktion gesperrt wurde. In diesem Fall arbeitet das System wie geplant. Wenn dieser Fehler auftritt, wiederholen Sie die zweite Transaktion. Dies entspricht der Art und Weise, wie Anwendungen Phantom-Lesefehler oder MVCC-Fehler (Multiversions Concurrency Control) behandeln.
- Der von der atomaren Transaktion zurückgegebene
GlobalStatus-Wert istHeuristicOutcome. In diesem Fall wurde ein atomarer Transaktionsvorgang abgebrochen, weil einer der Commit-Vorgänge nicht erfolgreich war. Dies ist ein seltenes Vorkommen und muss möglicherweise manuell behoben werden. Ein Nebeneffekt eines heuristischen Ergebnisses ist, dass einige Schlüssel möglicherweise durch Transaktionen gesperrt bleiben, die nicht festgeschrieben oder zurückgesetzt werden konnten. Verwenden Sie in diesem Fall den folgenden REST-API-Endpunkt, um die Sperre der atomaren Transaktion aufzuheben:restproxy/api/v2/atomicTransactions/{globalTransactionId}
Szenario: Atomare Transaktionen mit Beispielen untersuchen
Betrachten Sie das folgende Beispiel, das zwei der Beispiel-Chaincodes verwendet, die in Oracle Blockchain Platform, Balance Transfer und Marbles enthalten sind. Das Beispiel "Saldentransfer" stellt zwei Parteien dar, die Mittel zwischen Kontensalden transferieren können. Mit dem Marbles-Beispiel können Sie Murmeln erstellen und zwischen Besitzern austauschen. Sie können einzelne (nicht-atomare) Transaktionen verwenden, um einen Marmor zu kaufen, indem Sie im Chaincode Balance Transfer Geld austauschen und den Besitz des Marmors im Chaincode Marbles ändern. Wenn jedoch bei einer dieser Transaktionen ein Fehler auftritt, kann das Hauptbuch in einem inkonsistenten Zustand bleiben: Entweder wurden die Mittel übertragen, aber nicht der Marmor oder der Marmor wird übertragen, aber nicht bezahlt.
In diesem Szenario können Sie den vorhandenen Chaincode mit den REST-API-Endpunkten verwenden, die atomare Transaktionen unterstützen. Der Tausch von Geldern und der Eigentumsübergang des Marmors müssen beide erfolgreich sein oder beide scheitern. Wenn eine Transaktion auf einen Fehler stößt, wird keine Transaktion festgeschrieben. Gehen Sie folgendermaßen vor, um dieses Szenario zu untersuchen:
- Installieren Sie die Muster Balance Transfer und Marbles auf verschiedenen Kanälen. Weitere Informationen zur Installation der Beispiele finden Sie unter Oracle Blockchain Platform mit Beispielen kennenlernen.
- Rufen Sie im Beispiel Marbles die Aktion
Create a new marbleauf, um eine Reihe von Murmeln für verschiedene Marmorbesitzer zu erstellen. - Verwenden Sie den REST-Endpunkt
Invoke Atomic Transaction, um atomare Transaktionen abzuschließen, die sowohl die Marbles- als auch die Saldenübertragungsbeispiele aufrufen.
Beispiel: Die folgende Transaktion überträgt einen Marmor namens marble1 an Tom und sendet 50 Coins von Konto a an Konto b.
{
"transactions": [
{"chaincode":"obcs-marbles","args":["transferMarble", "marble1", "tom"],"timeout":0, "channel":"goods"},
{"chaincode":"obcs-example02","args":["invoke", "a", "b", "50"],"timeout":0, "channel":"wallet"}
],
"isolationLevel": "serializable",
"prepareTimeout": 10000,
"sync": true
}
Wenn in der vorherigen Transaktion beide Transaktionen in der Vorbereitungsphase erfolgreich sind, werden beide Transaktionen im Buch festgeschrieben. Wenn bei einer der beiden Transaktionen ein Fehler auftritt, wird in der zweiten Phase keine Transaktion festgeschrieben. Stattdessen werden beide Transaktionen zurückgesetzt. Beispiel: Wenn das Konto a weniger als 50 Münzen enthält, wird kein Geld vom Konto genommen, und Tom wird kein Marmor überwiesen.