ホームページ  >  記事  >  PHPフレームワーク  >  ThinkPHP6 で分散トランザクション処理を実行するにはどうすればよいですか?

ThinkPHP6 で分散トランザクション処理を実行するにはどうすればよいですか?

王林
王林オリジナル
2023-06-12 09:39:591983ブラウズ

インターネットの発展とアプリケーション シナリオの継続的な拡大に伴い、システムのパフォーマンスと信頼性に対する要件はますます高くなっています。複雑なビジネス シナリオでは、多くの場合、複数のサービスを連携して完了する必要があり、分散トランザクションの処理が必要になります。この記事では、ThinkPHP6 で分散トランザクション処理を行う方法を紹介します。

1. 分散トランザクションの基本概念

1. 分散トランザクション

分散システムとは、ネットワークを介して実行される複数のコンピューター上のプログラムとデータ リソースを指します。 、協力してタスクを完了します。この場合、複数のトランザクションに複数のリソースが関与する必要がある場合、分散トランザクションの調整が必要になります。分散トランザクションとは、複数のトランザクションによって共同して完了されるトランザクションを指し、ACID プロパティを満たす必要があります。

2.ACID 属性

データベースでは、ACID は原子性、一貫性、分離性、耐久性の 4 つの属性を指します。

原子性: トランザクションは分割できない作業単位であり、完全に完了したか、まったく完了せず、部分的な完了は存在しないという事実を指します。

一貫性: トランザクションの実行前後でデータベースの状態が一貫している必要があることを指します。たとえば、送金トランザクションでは、口座残高の合計は送金実行の前後で変化しません。

分離: 複数のトランザクションが並行して実行される場合、1 つのトランザクションの実行が他のトランザクションによって干渉されるべきではありません。

耐久性: トランザクションが送信されると、その結果はデー​​タベースに永続的に保存される必要があることを意味します。

2. ThinkPHP6 での分散トランザクションの実装

1. 分散トランザクションの問題

従来のリレーショナル データベースでは、分散トランザクションの実装には 2 フェーズ コミット ( 2PC) プロトコルを使用していますが、この方法には単一障害点、パフォーマンスのボトルネックなどのいくつかの問題があります。したがって、ビッグ データや同時実行性の高いアプリケーションのシナリオでは、分散トランザクションを実装するために他の方法を使用する必要があります。

2. 分散トランザクション ソリューション

ThinkPHP6 で分散トランザクション処理を実行するには、オープンソースの seata ミドルウェアを使用できます。seata はアプリケーションを TC (トランザクション コーディネーター)、TM の 3 つの役割に分割します。 (トランザクション マネージャー) および RM (リソース マネージャー):

TC (トランザクション コーディネーター): トランザクション コーディネーター。分散トランザクション モジュールのリソースを調整し、トランザクションの一貫性を達成する責任があります。

TM (トランザクション マネージャー): トランザクション マネージャー。トランザクションの開始、送信、ロールバック、およびその他のトランザクション関連の操作を担当します。

RM (リソース マネージャー): データベース操作、MQ 操作などのリソースの管理を担当するリソース マネージャー。

3. Seata の使用

seata を使用する前に、TC、RM、およびその他のリソースの作成を含め、seata をインストールして構成する必要があります。インストールと設定が完了したら、seata を使用して分散トランザクションを処理できるようになります 具体的な手順は以下のとおりです:

(1)seata の依存ライブラリを導入する

<!-- seata依赖库 -->
<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-all</artifactId>
    <version>${seata.version}</version>
</dependency>

(2)seata のファイルを設定する

分散トランザクションを必要とするモジュールでは、次の構成を application.properties に追加する必要があります:

# 配置seata的全局事务ID生成器
seata.tx-service-group=my_group
# type,AT表示AT模式,XA表示XA模式
seata.tx-type=AT
# 自动代理数据源
seata.autoproxy.datasource=true

(3) トランザクションの開始時に、グローバルに有効にします

トランザクションの開始時に、グローバルに有効にする必要があります:

// 开启全局事务
GlobalTransactionContext.begin(transactionName);

(4) トランザクションでの RM の使用

トランザクション (データベース RDMS など) で RM を使用する場合、 Seata が提供するエージェントを使用し、リソースを管理する必要があります。

// 使用代理获取connection
conn = ((DataSourceProxy) dataSource).getConnection();

(5) トランザクションの最後に、グローバル コミットを実行します。

トランザクションの最後に、グローバル コミットを実行します。は必須です:

// 提交全局事务
GlobalTransactionContext.getCurrentOrCreate().commit();

なぜならseataは分散トランザクションの内容をミドルウェアにカプセル化するため、seataを使用するとビジネスロジックと分散トランザクション処理を分離でき、管理や保守が容易になります。

3. 概要

この記事では、ThinkPHP6 と Seata ミドルウェアを組み合わせて、分散システムにおける分散トランザクションのプロセスと Seata ミドルウェアの使用方法を紹介します。実際のアプリケーションでは、分散トランザクション処理の特定のビジネス シナリオに応じて、パフォーマンスと信頼性のどちらかを選択する必要があります。

以上がThinkPHP6 で分散トランザクション処理を実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。