我目前正在阅读很多有关 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;
现在假设我想为房间 ID 15 插入一个新的预订,从 2012 年 2 月 15 日到 2012 年 2 月 24 日,这是我认为根据我阅读的内容我应该做的事情:
开始交易:
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 ?但这不会导致问题吗?感谢您的帮助!