最初にちょっとしたコンテキスト: 私は Web スキルと楽しみを練習するために小さなブラウザゲームを書いています :) いくつかのファクトリーとメインデポを所有しているユーザーがいます。これらは、内部の factorydepot に保管されるさまざまなタイプの製品を生産します。ユーザーは工場を「集めて」完成品をメインのデポに移すことができます。
実装には、PDO をデータベース コネクタとして使用する PHP を使用します。私のWebサーバーはMySQLデータベースを使用しており、デバッグにはローカルのPostgresデータベースを使用しています。
ユーザーは、収集リンクをクリックして応答を待つことなく、すべてのファクトリを収集できる必要があります。したがって、Ajax を使用して、ユーザーがすべてのファクトリを 1 回クリックし、すべてのリクエストが完了するまで待機できるようにします。この並列アクセスによってデータベースに矛盾が生じるのを防ぐために、分離レベル SERIALIZABLE のトランザクションを使用しています。pdo は分離レベルをサポートしていないため、Postgres-db との接続でクエリを送信します。
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET statement_timeout=10000;
2 番目のクエリは、別のトランザクションの進行中に並列トランザクションがキャンセルされるのを防ぐ必要があります。どちらのクエリもエラーを返しませんが、機能しません。ほぼ並行して 8 つのリクエストを送信すると、そのうちの 2 ~ 3 件のみが成功して返され、もう 1 件は postgres から "25P02 IN FAILED SQL TRANSACTION" というエラーが返されます。デバッグ中、トランザクションは他のトランザクションが完了するのを待たないように思えますが、これについてはよくわかりません。
今私の質問:
- 分離レベルとタイムアウトを PDO で動作させる可能性はありますか?
- 私が使用できる代替手段はありますか?(Zend のような重いフレームワークを除いて、すべてのメカニズムを深く掘り下げたい)
- 1 種類のデータベースと mysqli のような特殊なコネクタのみを使用すると、問題を解決できますか? PDO を使って柔軟性を高めるのは良い考えだと思いましたが、ブラウザゲームには不向きかもしれません。
- データベースアクセスに対する私のアプローチは大丈夫ですか? それとももっと良いデザインがありますか?
- そのようなエラーは正常であり、そのようなトランザクションは成功するまでループする必要がありますか? はいの場合、クライアント側で Ajax を使用するか、サーバー側で PHP を使用しますか?