我目前正在讀了很多關於InnoDB的交易,在這個時候,我只使用過的MyISAM表,所以我不是很習慣這一切:InnoDB的交易和客房預訂
這裏是我的表方案:
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-02-15到2012-02-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;
問題是,在默認的隔離模式(可重複讀),一旦我開始交易,我不會看到這個非常事務之外的任何其他INSERT。 那麼,如果在步驟1)之後另一個用戶插入衝突預留,會發生什麼情況?
也許我應該在這種情況下使用READ-COMMITED?但是這不會導致問題嗎? 感謝您的幫助!
輝煌,簡單和優雅,謝謝! –
非常聰明的做法:) –