TCC Practice
Écrivons maintenant la fonction de traitement spécifique 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');
À ce stade, les fonctions de traitement de chaque sous-transaction sont OK, puis démarrons la transaction TCC et effectuons des appels de branche
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'); });
À ce stade, une transaction distribuée TCC complète est terminée.
Si vous souhaitez exécuter entièrement un exemple réussi, alors référez-vous à cet exemple yedf/dtmcli-php-sample, il est très simple de l'exécuter
# 部署启动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 start
Annulation du TCC
$vega->handleFunc('/api/TransInTry', function (Mix\Vega\Context $ctx) { var_dump('TransInTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'FAILURE']);})->methods('POST');
En mode transaction TCC, de nombreux lecteurs se demanderont : que se passera-t-il si la confirmation/annulation échoue ? C’est une bonne question car cela signifie que vous réfléchissez profondément au modèle de transaction TCC. Le premier cas est un échec temporaire, tel qu'une panne de réseau, une indisponibilité d'une application ou d'une base de données. De telles erreurs seront réessayées et le succès sera finalement renvoyé ; l'autre cas est un échec commercial. Selon l'accord TCC, les ressources sont verrouillées. première étape pour garantir que des ressources suffisantes peuvent permettre l'exécution de Confirm/Cancel. En d'autres termes, en termes de logique du programme, Confirm/Cancel n'est pas autorisé à renvoyer une défaillance commerciale. Si une défaillance commerciale se produit, il s'agit d'un bug et les développeurs doivent le faire. corrigez manuellement le bug.
Résumé
»
Les exemples utilisés dans l'article sont extraits de yedf/dtm (https://github.com/yedf/ dtm), il prend en charge plusieurs modes de transaction : TCC, SAGA, .pub/summary/code.html#go). Fournit une fonction de barrière de sous-transaction pour résoudre avec élégance des problèmes tels que l'idempotence, la suspension et la compensation nulle. Après avoir lu cet article, vous êtes invités à visiter le projet github.com/yedf/dtm et à donner une étoile pour le soutenir !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!