Atomare Updates über Chaincodes und Kanäle hinweg vornehmen
Sie können atomare Transaktionen verwenden, um mehrere Transaktionen über Kanäle und Chaincodes hinweg auf atomare Weise abzuschließen.
Eine atomare Transaktion ist eine unteilbare Reihe von Datenoperationen, die entweder alle erfolgreich sind oder keine erfolgreich sind.
Atomare Transaktionen können in komplexen Situationen nützlich sein, in denen mehrere Chaincodes in separaten Kanälen bereitgestellt werden. Sie können atomare Transaktionen verwenden, um die Datenkonsistenz bei der Ausführung mehrerer Blockchain-Transaktionen zu gewährleisten, selbst wenn ein Netzwerk- oder Systemfehler auftritt. Oracle Blockchain Platform unterstützt atomare Transaktionen mit dem Zwei-Phasen-Commit-Protokoll. Auf eine Anfangsphase, in der jeder Datenvorgang vorbereitet wird, folgt eine Phase, 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 returnCode
-Wert) 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 unterstützt. Anstatt jedoch abgeschlossen zu werden, werden die Änderungen zwischengespeichert, und die Werte werden 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 integriertem 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 integriertem 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 durch die vorbereitete Transaktion gesperrt wurde. In diesem Fall funktioniert das System wie geplant. Wenn dieser Fehler auftritt, wiederholen Sie die zweite Transaktion. Dies entspricht der Art und Weise, wie Anwendungen Phantomlesefehler oder MVCC-Fehler (Multi-Version 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 Ereignis und muss möglicherweise manuell behoben werden. Ein Nebeneffekt eines heuristischen Ergebnisses besteht darin, dass einige Schlüssel möglicherweise durch Transaktionen gesperrt werden, die nicht festgeschrieben oder zurückgesetzt wurden. 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 Beispielkettencodes verwendet, die in Oracle Blockchain Platform enthalten sind: Balance Transfer und Marbles. Das Muster "Saldotransfer" stellt zwei Parteien dar, die Mittel zwischen Kontensalden transferieren können. Mit der Marbles-Probe können Sie Murmeln erstellen und zwischen Eigentümern austauschen. Sie könnten einzelne (nicht-atomare) Transaktionen verwenden, um einen Marmor zu kaufen, indem Sie Gelder im Balance Transfer-Kettencode austauschen und das Eigentum an dem Marmor im Marbles-Kettencode ändern. Wenn jedoch bei einer dieser Transaktionen ein Fehler auftritt, kann das Hauptbuch in einem inkonsistenten Zustand verbleiben: Entweder wurden die Gelder ü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 Geldwechsel und der Eigentumsübergang des Marmors müssen gelingen oder beides scheitern. Wenn bei einer Transaktion ein Fehler auftritt, wird keine Transaktion festgeschrieben. Gehen Sie folgendermaßen vor, um dieses Szenario zu untersuchen:
- Installieren Sie die Balance Transfer- und Marbles-Proben auf verschiedenen Kanälen. Weitere Informationen zum Installieren der Beispiele finden Sie unter Oracle Blockchain Platform Using Samples kennenlernen.
- Rufen Sie im Beispiel "Marbles" die Aktion
Create a new marble
auf, um eine Reihe von Marmor für verschiedene Marmorbesitzer zu erstellen. - Verwenden Sie den REST-Endpunkt
Invoke Atomic Transaction
, um atomare Transaktionen abzuschließen, die sowohl die Murmeln als auch die Saldenübertragungsmuster aufrufen.
Beispiel: Die folgende Transaktion überträgt einen Marmor mit dem Namen marble1
an Tom und sendet 50 Münzen vom 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 waren, werden beide Transaktionen im Buch festgeschrieben. Wenn bei einer Transaktion ein Fehler auftritt, wird keine Transaktion während der zweiten Phase festgeschrieben. Stattdessen werden beide Transaktionen zurückgesetzt. Beispiel: Wenn weniger als 50 Münzen auf dem Konto a vorhanden sind, wird kein Geld auf dem Konto berücksichtigt und kein Marmor auf Tom übertragen.
Es ist ein bekanntes Problem mit dem Muster "Murmeln" und dem Standardwert des Feldes Marmorbesitzer aufgetreten. Weitere Informationen finden Sie unter: Bekannte Probleme für Oracle Blockchain Platform.