ホームページ  >  記事  >  バックエンド開発  >  PHP を使用して分散トランザクション TCC を完了する方法を段階的に説明します。

PHP を使用して分散トランザクション TCC を完了する方法を段階的に説明します。

藏色散人
藏色散人転載
2021-09-22 15:32:394108ブラウズ

TCC とは何ですか? TCC は Try、confirm、および Cancel の略語で、2007 年に発行された「分散トランザクションを超えた生活: 背教者の意見」というタイトルの論文でパット ヘランドによって最初に提案されました。

TCC の構成

TCC は 3 つのフェーズに分かれています

  • Try フェーズ: 実行を試み、すべてのビジネス チェック (一貫性) を完了し、必要なビジネス リソースを確保する (準隔離)
  • 確認ステージ: すべてのブランチの試行が成功した場合は、確認ステージに進みます。確認は実際に業務を実行し、業務チェックは行わず、Try ステージで予約されたビジネス リソースのみを使用します。
  • Cancel ステージ: すべてのブランチの Try の 1 つが失敗した場合、Cancel ステージに進みます。 。キャンセルすると、試行フェーズで予約されたビジネス リソースが解放されます。

TCC 分散トランザクションには、従来の XA 分散トランザクションと同じ 3 つの役割があります。

  • AP/アプリケーションは、グローバル トランザクションを開始し、グローバル トランザクションを定義します。トランザクション ブランチは含まれていますか?
  • RM/リソース マネージャーは、ブランチ トランザクションのさまざまなリソースの管理を担当します。
  • TM/トランザクション マネージャーは、グローバル トランザクションの適切な実行を調整する責任を負います。確認とキャンセルの実行、およびネットワーク例外の処理

銀行間送金と同様の業務を行う場合、送金 (TransOut) と送金 (TransIn) は異なります。 TCC トランザクションの一般的なシーケンス図は次のとおりです。

PHP を使用して分散トランザクション TCC を完了する方法を段階的に説明します。 を使用して分散トランザクション TCC を完了する方法を段階的に説明します。

##TCC の実践

次に、 TCC トランザクションの具体的な開発

TCC で現在利用可能なオープン ソース フレームワークは主に、seata に代表される Java 言語です。この例では、nodejs を使用しており、使用される分散トランザクション フレームワークは dtm であり、分散トランザクションを非常にエレガントにサポートします。 TCCの構成を詳しく説明しましょう

Try/確認/キャンセルの具体的な処理関数を書いてみましょう

$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

TCC のロールバック

銀行がユーザー 2 の口座に異常があることを発見し、ユーザー 2 への金額の送金時に返却が失敗した場合はどうなりますか? TransIn が失敗を返すようにすることで、この状況をシミュレートできます

$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');
トランザクション失敗の相互作用のシーケンス図を示します

PHP を使用して分散トランザクション TCC を完了する方法を段階的に説明します。 を使用して分散トランザクション TCC を完了する方法を段階的に説明します。

これと成功した TCC の違いは次のとおりです。 、サブトランザクションが失敗を返した場合、グローバル トランザクションは後でロールバックされ、すべてのグローバル トランザクションが確実にロールバックされるように各サブトランザクションの Cancel オペレーションが呼び出されます。

TCC トランザクション モデルに関して、多くの読者は、確認/キャンセルが失敗した場合はどうなるのかと疑問に思うでしょう。これは、TCC トランザクション モデルについて深く考えていることを意味するため、良い質問です。最初のケースは、ネットワーク障害、アプリケーションまたはデータベースのダウンタイムなどの一時的な障害です。このようなエラーは再試行され、最終的には成功が返されます。もう 1 つのケースはビジネス障害です。TCC 協定によれば、リソースは次の場所にロックされます。十分なリソースが確認/キャンセルを実行できることを確認する最初の段階。つまり、プログラム ロジックの観点から、確認/キャンセルはビジネスの失敗を返すことはできません。ビジネスの失敗が発生した場合、それはバグであり、開発者は次のことを行う必要があります。手動でバグを修正します。

概要

この記事では、TCC の理論的知識を紹介し、通常のトランザクションと成功したトランザクションをカバーする例を通じて TCC トランザクションを作成する完全なプロセスも示しました。完了とロールバックの成功。読者の皆様はこの記事を通じて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 サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。