###前提・実現したいこと
CakePHP3を用いた予約システムを構築しています。
重複した時間に他ユーザーが予約できないように制御を行いたいのですが、同時アクセスがあった場合、重複チェックをする抜け、同じ時間で予約ができてしまうことがわかりました。
サンプル
<?php // ①トランザクション開始 $this->Model->connection()->begin(); try { // ②重複チェック if ($this->Model->exists([])) { throw new Exception('error'); } // ③保存処理 $entity = $this->Model->newEntity([]); if (!$this->Model->save($entity)) { throw new Exception('error'); } // ④コミット $this->Model->connection()->commit(); } catch(Exception $e) { // ⑤ロールバック $this->Model->connection()->rollback(); }
②で重複チェックを行っていますが、同時アクセスの場合save
前に両アクセス分のチェックが完了してしまい、両データとも保存されてしまう状況です。
②の重複チェックから保存処理までの間、もう一方のアクセスを待機させておく、もしくはDBへのアクセスをロックする方法などありますでしょうか?
知識不足で恐縮ですが、是非、お力お貸しいただけますでしょうか。
何卒よろしくお願いいたします。
###バージョンなど
PHP:7.1.3
CakePHP:3.4.11
MySQL:5.7.17
Nginx:1.10.2
追記
該当テーブルは以下となります。
CREATE TABLE `bookings` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `car_id` bigint(20) NOT NULL, `parking_id` bigint(20) NOT NULL, `status` tinyint(2) NOT NULL, `start_date` datetime NOT NULL, `end_date` datetime NOT NULL, `checkin_date` datetime DEFAULT NULL, `checkout_date` datetime DEFAULT NULL, `cancel_date` datetime DEFAULT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
回答4件
あなたの回答
tips
プレビュー