2

PHPとMySQLを使用して2フェーズコミットを実装しようとしていますが、不足しています。

私が見つけた主なブロックは、MySQL接続リソースを第2フェーズで再び見つけることができる場所に保存できないことです。データベースハンドルをシリアル化することは可能ですか?

これが私がコーディングしようとしているケースです:

  1. ユーザーがデータを送信する
  2. サーバーはMySQLトランザクションを開始し、受信したデータに基づいていくつかのクエリを実行します。
  3. サーバーはファイルをユーザーに送り返します
  4. ユーザーがファイルを正常に受信すると、サーバーはトランザクションをコミットします。それ以外の場合はロールバックします。

これには2つのHTTP要求/応答サイクルが必要なようです。そのため、トランザクションをコミットするには、2番目の要求で同じデータベースハンドルに再接続できる必要があります。私はこの部分で失敗してきました。

「これはPHPでは不可能」であっても、アドバイスは大歓迎です。

4

3 に答える 3

2

LIXA Transaction Manager (http://lixa.sourceforge.net/) を参照してください。これは、リリース 0.9.0 から PHP と MySQL を統合します。

分散トランザクション処理と 2 フェーズ コミット機能も提供します。

よろしく

Ch。F.

于 2012-04-22T10:15:13.770 に答える
2

PHPはリクエスト/レスポンスに基づいているため、永続的なDB接続の実装は可能ではありません.AFAIK.

ある種の発券メカニズムを使用して、この制限を回避することができます。あなたの手順は次のとおりです。

  1. ユーザーがデータを送信
  2. サーバーは MySQL トランザクションを開始し、受信したデータに基づいていくつかのクエリを実行し、そのトランザクションに「一意の」チケットを割り当てます。
  3. サーバーはファイルとチケットをユーザーに送り返します
  4. ユーザーがファイルを正常に受信し、そのチケットを含む別の要求を送信すると、サーバーはそのトランザクションをコミットします。それ以外の場合はロールバックします。
  5. Cassy のコメントを参照してください: 一定期間が経過した後、コミットされていないすべての TA をロールバックして、データベースが古いトランザクションで「殺到」するのを防ぐ必要があります。

HTH

于 2009-10-12T09:20:38.217 に答える
0

KB22 と rojoca に答えるために、私がこのようにする必要がある理由は、私が参照している「ファイル」が実際にはモバイル デバイス上のデータ ストアとして終わる sqlite データベースであるためです。

最初のリクエストは、更新された sqlite データベースをサーバーにポストし、サーバーは sqlite テーブルからのデータをマージしようとします。モバイル デバイスが新しい sqlite データベース (モバイル デバイスの変更や Web アプリケーションからのその他の新しいものを反映するもの) を正常に受信できない場合に問題が発生します。これは、同じ (古い) sqlite データベースをその結果、モバイル デバイスで作成されたすべての Web テーブルに重複するエントリが作成されます。

そのため、Web は、マージの変更をコミットする前に、デバイスに新しいデータベースがあることを確認する必要があります。ネットワークの気まぐれを考えると、これは、デバイスが新しい sqlite データベースを受信した後に明示的な ACK を送信できる場合にのみ実現可能と思われます。これは、2 つの要求を行う場合にのみ可能です (1. マージする sqlite データベース、2. デバイス上の新しい sqlite データベースの受信の ACK)。

これは確かに厄介な問題であり、PHP が必要なレベルまでデータベース ハンドルを操作できないことを知ることは有益な情報です。

[また、「実際の」Web データベース テーブルに基づいてデバイスにデータを返す必要があるため、トランザクション テーブルを使用できないと思います。実際のテーブルを使用しないと、auto_increment フィールドで問題が発生する可能性があると思います]

コメントありがとうございます。

于 2009-10-13T12:50:01.927 に答える