我在為酒店預訂構建DB表時遇到困難。
在我的預訂資料庫中,有一個預訂的start_datetime和end_datetime屬性來表示預訂的時間,我試圖用一個觸發陳述句來防止雙重預訂,但我確信這種方法很容易出現競爭條件。
在這種情況下,我怎樣才能防止競賽條件呢?
觸發器:
CREATE DEFINER=`admin`@`%` TRIGGER`prevent_double_booking` BEFORE INSERT ON `reservation_tbl` FOR EACH ROW BEGIN >。
SET @val = EXISTS (
SELECT NULL FROM `reservation_tbl` As existing
WHERE NEW.room_idx = existing.room_idx
AND (
( new.start_datetime <= existing.start_datetime AND existing.start_datetime < new.end_datetime )
OR ( new.start_datetime < existing.end_datetime AND existing.end_datetime<= new.end_datetime )
OR ( existing.start_datetime <= new.start_datetime AND new.start_datetime< end_datetime )
OR ( existing.start_datetime < new.end_datetime AND new.end_datetime<= end_datetime )
)
);
如果(@val)THEN
信號SQLSTATE '45000' SET MESSAGE_TEXT = 'Double Booking Detected';
END IF;
END; END
表:
CREATE TABLE `reservation_tbl` (
`reserv_idx` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`member_idx` INT(11) UNSIGNED NOT NULL,
`room_idx` INT(11) UNSIGNED NOT NULL。
`start_datetime` DATETIME NOT NULL,
`end_datetime` DATETIME NOT NULL,
`created_datetime` DATETIME NOT NULL DEFAULT current_timestamp()。
`updated_datetime` DATETIME NULL DEFAULT NULL ON UPDATE current_timestamp() 。
`deleted_datetime` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`reserv_idx`) USING BTREE,
);
謝謝你
ps. 起作用的資料庫是MariaDB 10.3.31.
。uj5u.com熱心網友回復:
CREATE DEFINER=`admin`@`%` TRIGGER `prevent_double_booking`。
BEFORE INSERT ON `reservation_tbl`.
FOR EACH ROW
BEGIN
如果EXISTS ( SELECT NULL)
FROM `reservation_tbl` AS existing
WHERE NEW.room_idx = existing.room_idx
and new.start_datetime <= existing.end_datetime
AND existing.start_datetime <= new.end_datetime ) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'double booking Detected';
END IF;
END; END
如果時隙不能相鄰,則使用嚴格的不相等,而不是軟不相等。
為了防止并發程式的交叉影響,在插入前鎖定表。或者在相應的隔離級別的事務中插入。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/306821.html
標籤:
上一篇:<p>所以我有一個表Product_Information</p>。 <tableclass="s-table"> <thead>
