TL;DR - MySQL では、テーブルのロックとトランザクションの使用を同時に行うことはできません。これを回避する方法はありますか?
(遅い) 外部システムからのデータをキャッシュするために使用している MySQL テーブルがあります。データは Web ページ (PHP で記述) を表示するために使用されます。キャッシュされたデータが古すぎると判断された場合、Web 接続の 1 つがキャッシュされたデータの更新をトリガーする必要があります。
私が対処しなければならない3つの問題があります:
- 他のクライアントは、更新中にキャッシュ データを読み取ろうとします。
- 複数のクライアントがキャッシュ データが古すぎると判断し、同時に更新を試みる場合があります。
- 作業を行っている PHP インスタンスはいつでも予期せず終了する可能性があり、データが破損することはありません。
トランザクションを使用して最初と最後の問題を解決できるので、クライアントはトランザクションがコミットされるまで古いデータを読み取ることができ、すぐに新しいデータが表示されます。問題が発生すると、トランザクションがロールバックされるだけです。
2 番目の問題は、テーブルをロックすることで解決できます。これにより、1 つのプロセスだけが更新を実行できるようになります。他のプロセスがロックを取得するまでに、彼らは打ち負かされ、何も更新する必要がないことに気付くでしょう。
これは、テーブルをロックしてトランザクションを開始する必要があることを意味します。MySQL のマニュアルによると、これは不可能です。トランザクションを開始するとロックが解放され、テーブルをロックするとアクティブなトランザクションがコミットされます。
これを回避する方法はありますか、それとも私の目標を完全に達成する別の方法はありますか?