短期間に多くのユーザーがチケットを予約し、合計で一定数しか予約できないシステムを作っています。600 枚のチケットが利用可能で、すべてが 3 時間以内に予約される可能性があるとします。
理想的には、予約の上限に達しないようにしたいので、予約を作成する前に、利用可能なチケットの数に対して予約が可能かどうかを確認しています. 重要なのは、チケットの制限を超えないようにするために、そのチェックとユーザーへのチケットの割り当ての間に更新が行われないようにする必要があることです。
これを達成するためにmysqlテーブル書き込みロックを使用しようとしていますが、codeigniterフレームワーク内でこれを実装する際に問題が発生しています。これを処理するモデル内で、いくつかの関数を作成しました。1 つは予約を作成するためのもので、もう 1 つはさまざまな種類のチケットの数をカウントするためのものです。問題は、チケット カウント機能がロックされているため、同じデータベース セッションを共有していないように見えることです。
実行順序は
- コントローラーで $this->model_name->create_reservation を実行します
- model_name->create_reservation でロック クエリを実行します
- model_name->create_reservation のコール カウント メソッド
- おそらく別のデータベースセッションを使用しているため、カウント関数(model_nameクラスのメソッド)がロックアップしますか?
データベース ライブラリは、$this->load->database(); を使用してモデルの __construct メソッドにロードされます。
何か案は?