PHPとMySQLを使用したトランザクション処理
-
20-09-2019 - |
質問
PHPとMySQLを使用して2フェーズのコミットを実装しようとしています。
私が見つけた主なブロックは、MySQL接続リソースを第2フェーズで再び見つけることができる場所に保存できないということです。データベースハンドルをシリアル化することは可能ですか?
これが私がコーディングしようとしているケースです:
- ユーザーはデータを送信します
- サーバーはMySQLトランザクションを起動し、受信したデータに基づいていくつかのクエリを実行します。
- サーバーはファイルをユーザーに送り返します
- ユーザーがファイルを正常に受信した場合、サーバーはトランザクションをコミットします。それ以外の場合は、それを転がします。
これには2つのHTTP要求/応答サイクルが必要であるように思われるため、トランザクションをコミットするために、2番目の要求で同じデータベースハンドルに再接続できる必要があります。私はこの部分で失敗しています。
たとえ「これはPHPでは不可能です」であっても、アドバイスは歓迎されます。
解決
Lixa Transaction Manager(http://lixa.sourceforge.net/)をご覧ください。リリース0.9.0からPHPとMySQLを統合します。
分散トランザクション処理と2フェーズコミット機能も提供します。
よろしく
ch。 F.
他のヒント
PHPは要求 /応答に基づいているため、永続的なDB接続の実装は可能性がありません。
ある種のチケットメカニズムを使用して、この制限を回避することができます。あなたのステップは次のとおりです。
- ユーザーはデータを送信します
- サーバーはMySQLトランザクションを開始し、受信したデータに基づいていくつかのクエリを実行し、そのトランザクションに「一意の」チケットを割り当てます。
- サーバーはファイルとチケットをユーザーに送り返します
- ユーザーがファイルを正常に受信し、そのチケットを含む別のリクエストを送信した場合、サーバーはトランザクションをコミットします。それ以外の場合は、それを転がします。
- Cassyのコメントを参照してください:一定の期間の後、DBが古いトランザクションで「浸水」しないようにするために、すべてがコミットされていないTASを巻き戻す必要があります
Hth
KB22とRojocaに答えるために、私がこのようにする必要がある理由は、私が言及している「ファイル」が実際にモバイルデバイスのデータストアとして終わるSQLiteデータベースであることです。
最初の要求は、更新されたSQLiteデータベースをサーバーに投稿します。サーバーは、SQLiteテーブルのデータにマージしようとします。モバイルデバイスが新しいSQLiteデータベース(モバイルデバイスの変更とWebアプリケーションからその他の新しいものを反映したもの)を正常に受信しない場合、問題が発生します。 2回目のWebで、モバイルデバイスで作成されたものに対してWebテーブルに複製されたエントリが表示されます。
そのため、マージの変更をコミットする前に、デバイスに新しいデータベースがあることを確認する必要があります。ネットワークの気まぐれを考えると、これは、新しいSQLiteデータベースを受信した後にデバイスが明示的なACKを送信できる場合にのみ実行可能と思われます。これは、2つのリクエストを行う場合にのみ可能です(1.マージするSQLiteデータベース; 2.デバイス上の新しいSQLiteデータベースの受領のACK)。
確かにとげのある問題であり、PHPがデータベースのハンドルを必要なレベルまで操作できないことを知ることは有用な情報です。
「実際の」Webデータベーステーブルに基づいてデータをデバイスに返す必要があるため、トランザクションテーブルを使用できるとは思いません。実際のテーブルを使用しなかった場合、auto_incrementフィールドの問題に遭遇すると思います
すべてのコメントをありがとう。