TCC とは何ですか? TCC は Try、confirm、および Cancel の略語で、2007 年に発行された「分散トランザクションを超えた生活: 背教者の意見」というタイトルの論文でパット ヘランドによって最初に提案されました。
TCC は 3 つのフェーズに分かれています
TCC 分散トランザクションには、従来の XA 分散トランザクションと同じ 3 つの役割があります。
銀行間送金と同様の業務を行う場合、送金 (TransOut) と送金 (TransIn) は異なります。 TCC トランザクションの一般的なシーケンス図は次のとおりです。
$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');この時点では、各サブトランザクションの処理関数はOKなので、TCCを開きますトランザクション、分岐呼び出しを行う
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'); });この時点で、完全な TCC 分散トランザクションが完了します。 成功例を完全に実行したい場合は、この例 yedf/dtmcli-php-sample を参照してください。実行は非常に簡単です。
# 部署启动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
$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');トランザクション失敗の相互作用のシーケンス図を示します これと成功した TCC の違いは次のとおりです。 、サブトランザクションが失敗を返した場合、グローバル トランザクションは後でロールバックされ、すべてのグローバル トランザクションが確実にロールバックされるように各サブトランザクションの Cancel オペレーションが呼び出されます。 TCC トランザクション モデルに関して、多くの読者は、確認/キャンセルが失敗した場合はどうなるのかと疑問に思うでしょう。これは、TCC トランザクション モデルについて深く考えていることを意味するため、良い質問です。最初のケースは、ネットワーク障害、アプリケーションまたはデータベースのダウンタイムなどの一時的な障害です。このようなエラーは再試行され、最終的には成功が返されます。もう 1 つのケースはビジネス障害です。TCC 協定によれば、リソースは次の場所にロックされます。十分なリソースが確認/キャンセルを実行できることを確認する最初の段階。つまり、プログラム ロジックの観点から、確認/キャンセルはビジネスの失敗を返すことはできません。ビジネスの失敗が発生した場合、それはバグであり、開発者は次のことを行う必要があります。手動でバグを修正します。
分散トランザクションのための 7 つの最も古典的なソリューション 」を参照してください。
この記事で使用されている例は、yedf / からの抜粋です。 dtm (https://github.com/yedf/dtm) は、複数のトランザクション モード (TCC、SAGA、XA、トランザクション メッセージの言語間サポート) をサポートし、golang、python、Java、PHP を使用して分散トランザクション TCC を完了する方法を段階的に説明します。 を使用して分散トランザクション TCC を完了する方法を段階的に説明します。、nodejs などの顧客をサポートしています。その他の言語のターミナルについては、各言語の SDK (https://dtm.pub/summary/code.html#go) を参照してください。冪等性、一時停止、ヌル補償などの問題をエレガントに解決するサブトランザクション バリア機能を提供します。 この記事を読んだ後は、github.com/yedf/dtm プロジェクトにアクセスして、スターを付けてサポートしてください。以上がPHP を使用して分散トランザクション TCC を完了する方法を段階的に説明します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。