ホームページ  >  記事  >  バックエンド開発  >  PHPで分散トランザクション処理を実行するにはどうすればよいですか?

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

王林
王林オリジナル
2023-05-13 08:07:511541ブラウズ

インターネット アプリケーションの継続的な開発に伴い、分散システムはますます一般的になってきました。分散システムでは、トランザクションに複数のコンポーネントまたはサービスが関与する場合があり、分散トランザクション処理の問題が発生します。一般的に使用されるサーバー側プログラミング言語として、PHP は分散トランザクション処理の問題を解決する必要もあります。この記事では、PHP で分散トランザクションがどのように実行されるかについて説明します。

    #分散トランザクション処理とは何ですか?
従来のスタンドアロン環境では、トランザクション処理は非常に簡単です。通常の状況では、トランザクションはデータベースに接続し、データの挿入、更新、削除などの操作を実行してから、トランザクションをコミットまたはロールバックするだけで済みます。ただし、分散システムではトランザクションに複数のコンポーネントまたはサービスが関与するため、トランザクションの一貫性を確保するために、すべてのコンポーネントまたはサービスがトランザクションを正常に送信またはロールバックできることを確認する必要があります。

    PHP における分散トランザクション処理
PHP では、通常、データを保存するためにデータベースを使用します。したがって、複数のデータベース間のトランザクション操作の一貫性を維持する方法を見つける必要があります。従来の MySQL はローカル トランザクションのみをサポートしていましたが、XA プロトコルを使用してデータベース間のトランザクションを実装できます。

XA プロトコルは、複数のデータベースが同じトランザクションに参加できるようにする分散トランザクション プロトコルです。 XA プロトコルは、準備とコミットの 2 つのフェーズに分かれています。

準備フェーズでは、すべてのトランザクション参加者は、トランザクションのコミットまたはロールバックに対して「同意」または「反対」の応答を返す必要があります。これらの応答は、グローバル トランザクション コーディネーターによって収集されます。すべてのトランザクション参加者がトランザクションのコミットに同意すると、コミット フェーズに入りますが、1 人の参加者が同意しない場合は、ロールバック フェーズに入ります。

コミット フェーズでは、トランザクションのアトミック性を確保するために、すべての参加者がローカル トランザクションをローカル データベースに送信する必要があります。

    PHP の XA インターフェイス
PHP では、XA インターフェイスを使用して XA プロトコルを実装できます。以下にいくつかの主要な XA インターフェイス関数を示します。

    XA_START: XA 分散トランザクションを開始するには、最初にすべての参加者の準備操作を調整する必要があります。
  • XA_END: XA 分散トランザクションを終了します。この関数はトランザクションをコミットまたはロールバックしません。
  • XA_PREPARE: 参加者に対して準備操作を実行します。この操作はトランザクションをコミットまたはロールバックしません。
  • XA_COMMIT: XA 分散トランザクションを送信します。
  • XA_ROLLBACK: XA 分散トランザクションをロールバックします。
  • XA_RECOVER: 再起動後に未完了の XA 分散トランザクションを回復します。
    サンプル コード
次は、XA インターフェイスを使用して分散トランザクション操作を実装する方法を示す簡単な PHP プログラムです。

$mysql1 = new mysqli("localhost", "username1", "password1", "database1");
$mysql2 = new mysqli("localhost", "username2", "password2", "database2");

//开始一个XA事务
$xa = mysqli_init();
$conn1 = mysqli_real_connect($xa, "localhost", "username1", "password1", "database1");
$conn2 = mysqli_real_connect($xa, "localhost", "username2", "password2", "database2");
$xid = uniqid('', true);
mysqli_autocommit($xa, FALSE);
mysqli_begin_transaction($xa, MYSQLI_TRANS_START_WITH_XID, $xid);

//对数据库1进行操作
mysqli_query($mysql1, "INSERT INTO table1 (value) VALUES ('test')");

//对数据库2进行操作
mysqli_query($mysql2, "INSERT INTO table2 (value) VALUES ('test')");

//准备提交事务
$xares1 = mysqli_prepare($xa, "XA PREPARE '$xid'");
$xares2 = mysqli_prepare($xa, "XA PREPARE '$xid'");

if (mysqli_stmt_execute($xares1) && mysqli_stmt_execute($xares2)) {
    //提交事务
    $xacmt1 = mysqli_prepare($xa, "XA COMMIT '$xid'");
    $xacmt2 = mysqli_prepare($xa, "XA COMMIT '$xid'");
    if (mysqli_stmt_execute($xacmt1) && mysqli_stmt_execute($xacmt2)) {
        //事务提交成功
        mysqli_commit($mysql1);
        mysqli_commit($mysql2);
    } else {
        //事务提交失败
        mysqli_rollback($mysql1);
        mysqli_rollback($mysql2);
    }
} else {
    //准备操作失败
    mysqli_rollback($mysql1);
    mysqli_rollback($mysql2);
}

//关闭数据库连接
mysqli_close($mysql1);
mysqli_close($mysql2);

    概要
分散トランザクション処理は、最新のアプリケーションにおける中心的な問題です。 PHP では、XA インターフェイスを使用してこれを実現できます。 XA プロトコルを実装することで、複数のデータベース間のトランザクション操作の一貫性を確保できます。 XA インターフェイスを使用するには、ある程度の技術的基礎が必要ですが、慣れれば分散トランザクション処理を簡単に実装できます。

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

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