Heim > Artikel > Backend-Entwicklung > Bringen Sie Ihnen Schritt für Schritt bei, wie Sie mit PHP eine verteilte TCC-Transaktion abschließen
Weiter Wir werden eine TCC-Transaktion durchführen. Spezifische Entwicklung
Das derzeit für TCC verfügbare Open-Source-Framework ist hauptsächlich die Java-Sprache, dargestellt durch Seata. Unser Beispiel verwendet NodeJS und das verwendete Framework für verteilte Transaktionen ist DTM, das verteilte Transaktionen sehr elegant unterstützt. Lassen Sie uns die Zusammensetzung von TCC im Detail erklären
Jetzt schreiben wir die spezifische Verarbeitungsfunktion „Try/Confirm/Cancel“$vega->handleFunc('/api/TransOutTry', function (Mix\Vega\Context $ctx) { var_dump('TransOutTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransOutConfirm', function (Mix\Vega\Context $ctx) { var_dump('TransOutConfirm', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransOutCancel', function (Mix\Vega\Context $ctx) { var_dump('TransOutCancel', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInTry', function (Mix\Vega\Context $ctx) { var_dump('TransInTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInConfirm', function (Mix\Vega\Context $ctx) { var_dump('TransInConfirm', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInCancel', function (Mix\Vega\Context $ctx) { var_dump('TransInCancel', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');An diesem Punkt sind die Verarbeitungsfunktionen jeder Untertransaktion in Ordnung, starten dann die TCC-Transaktion und führen Verzweigungsaufrufe durch
Dtmcli\tccGlobalTransaction($dtm, function ($tcc) use ($svc) { /** @var Dtmcli\Tcc $tcc */ $req = ['amount' => 30]; $tcc->callBranch($req, $svc . '/TransOutTry', $svc . '/TransOutConfirm', $svc . '/TransOutCancel'); $tcc->callBranch($req, $svc . '/TransInTry', $svc . '/TransInConfirm', $svc . '/TransInCancel'); });
# 部署启动dtm# 需要docker版本18以上git clone https://github.com/yedf/dtmcd dtm docker-compose up# 另起一个命令行https://github.com/yedf/dtmcli-php-sample.gitcd dtmcli-php-sample composer installphp demo.php startRollback von TCCWenn die Bank die Überweisung des Betrags vorbereitet an den Benutzer Um 2 Uhr wird festgestellt, dass das Konto von Benutzer 2 abnormal ist und die Rückgabe fehlschlägt. Wir können diese Situation simulieren, indem wir TransIn einen Fehler zurückgeben lassen Rufen Sie den Abbruchvorgang jeder Untertransaktion auf, um sicherzustellen, dass alle globalen Transaktionen zurückgesetzt werden. Im TCC-Transaktionsmodus werden sich viele Leser fragen: Was passiert, wenn Bestätigen/Abbrechen fehlschlägt? Das ist eine gute Frage, denn sie bedeutet, dass Sie intensiv über das TCC-Transaktionsmodell nachdenken. Der erste Fall ist ein vorübergehender Fehler, wie z. B. ein Netzwerkausfall, eine Anwendungs- oder Datenbankunterbrechung, und der andere Fall ist ein Geschäftsausfall Erste Stufe, um sicherzustellen, dass ausreichende Ressourcen die Ausführung von „Bestätigen/Abbrechen“ ermöglichen. Mit anderen Worten: Bestätigen/Abbrechen darf nicht zu einem Geschäftsfehler führen, und die Entwickler müssen dies tun Beheben Sie den Fehler manuell.
Die sieben klassischsten Lösungen für verteilte Transaktionen
“Die in diesem Artikel verwendeten Beispiele sind Auszüge aus yedf/dtm (https://github.com/yedf / dtm) unterstützt es mehrere Transaktionsmodi: TCC, SAGA, .pub/summary/code.html#go). Bietet eine Barrierefunktion für Untertransaktionen, um Probleme wie Idempotenz, Aussetzung und Nullkompensation elegant zu lösen.
Nachdem Sie diesen Artikel gelesen haben, können Sie gerne das Projekt github.com/yedf/dtm besuchen und einen Stern vergeben, um es zu unterstützen!
Das obige ist der detaillierte Inhalt vonBringen Sie Ihnen Schritt für Schritt bei, wie Sie mit PHP eine verteilte TCC-Transaktion abschließen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!