1

PHP と Mysqli で書かれた複雑なデータベース アプリケーションに取り組んでいます。大規模なデータベース操作では、バックグラウンドで動作するデーモン (PHP も) を使用しています。これらの操作には数分かかる場合がありますが、ユーザーが影響を受けるデータにアクセスできないようにし、代わりにメッセージを表示したいと考えています。

Mysql テーブルを作成し、特定のデーモン操作が行われるたびに行を挿入することを考えました。そうすれば、データにアクセスしようとしているときに特定の操作が行われたかどうかをいつでも確認できます。

ただし、もちろん、デーモン プロセスが何らかの理由で終了した場合 (コンソールからの強制終了、データベース接続の切断、プラグの抜き取りなど)、レコードがデータベースに残らないことが重要です。Mysql トランザクション /変更を公開するにはコミットが必要であり、終了してもレコードはデータベースに残るため、ロールバックはこれを行うことができます。

プロセスが終了した場合にレコードが確実に削除されるようにする方法はありますか?

4

1 に答える 1

2

これは興味深い問題です。私は実際に数年前に大学のコースでこの問題を実装しました。

私が使用したトリックは、トランザクションの分離をいじることです。デーモンが進行中であることを示すレコードを作成するが、それをコミットしない場合、他のクライアントはそのレコードを認識しないというのは正しいことです。ただし、そのクライアントの分離レベルを READ UNCOMMITTED に設定すると、READ UNCOMMITTED はまだコミットされていない他のクライアントからの変更を表示するため、進行中であることを示すレコードが表示されます。(デーモンはデフォルトの分離レベルのままになります)。

クライアントの分離レベルを、非常に危険な可能性があるため、他の作業ではなく、そのデーモン チェックに対してのみコミットされていない読み取りに設定する必要があります。

デーモンがクラッシュすると、トランザクションは中止され、記録は失われます。成功した場合は、データベースで完了としてマークするか、レコードを削除するなどして、コミットします。デーモンが何らかの理由で失敗した場合、行ったすべての変更が元に戻され、再試行できるため、これは非常に便利です。

さらに説明やコードが必要な場合は、私の割り当てをどこかで見つけることができるかもしれません:)

トランザクション分離レベルのリファレンス

これにはすべて InnoDB または適切なトランザクション DB が必要であることに注意してください。

于 2012-06-08T22:57:22.847 に答える