私は現在、InnoDBでのトランザクションについて多くのことを読んでいますが、現時点ではmyISAMテーブルしか使用していないため、これらすべてにあまり慣れていません。
これが私のテーブルスキームです:
CREATE TABLE IF NOT EXISTS `reservations` (
`id_reservation` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`id_room` mediumint(8) unsigned NOT NULL,
`date_from` date NOT NULL,
`date_to` date NOT NULL,
`cancelled` enum('Y','N') NOT NULL DEFAULT 'N',
PRIMARY KEY (`id_reservation`),
KEY `id_room` (`id_appartement`)
) ENGINE=InnoDB;
ここで、2012-02-15から2012-02-24までの部屋ID 15の新しい予約を挿入したいとします。これが、私が読んだ内容に基づいて行うべきだと思うことです。
トランザクションを開始します:
START TRANSACTION;
行を挿入します
INSERT INTO reservations SET id_room = 15, date_from = '2012-02-15', date_to='2012-02-24', cancelled='N';
今行った予約と競合する予約があるかどうかを確認します
SELECT * FROM reservations WHERE id_room = 15 AND cancelled = 'N' AND date_from < '2012-02-24' AND date_to > '2012-02-15' AND id_reservation <> LAST_INSERT_ID();
そうでない場合は、
COMMIT;
そうしないと、
ROLLBACK;
問題は、デフォルトの分離モード(REPEATABLE-READ)で、トランザクションを開始すると、このトランザクションの外部で行われた他のINSERTが表示されないことです。では、ステップ1)の直後に、別のユーザーが競合する予約を挿入するとどうなるでしょうか。
この場合、READ-COMMITEDを使用する必要がありますか?しかし、これも問題につながるのではないでしょうか?助けてくれてありがとう!