Транзакция MySQL: SELECT + INSERT

Я строю веб-приложение - систему бронирования с использованием php и mysql. Система позволит пользователям резервировать временные интервалы на некоторых устройствах (пользовательское время работает на этом устройстве).

Я называю эти зарезервированные временные интервалы временными интервалами. Слоты хранятся в таблице базы данных mysql следующим образом:

CREATE TABLE IF NOT EXISTS `slot` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`start` int(11) unsigned DEFAULT NULL,
`end` int(11) unsigned DEFAULT NULL,
`uid` int(11) unsigned DEFAULT NULL,
`group` int(11) unsigned DEFAULT NULL,
`message` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`devices_id` int(11) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `start_2` (`start`),
UNIQUE KEY `end_2` (`end`),
KEY `index_foreignkey_slot_devices` (`devices_id`),
KEY `start` (`start`),
KEY `end` (`end`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci AUTO_INCREMENT=6997 ;  

(эта таблица создается автоматически с помощью redbean orm, и я еще не оптимизировал ее)

Поэтому, когда пользователь создает резервирование, в эту таблицу вставляется новая строка. В столбцах начало, конец я сохраняю метки времени начала и конца каждого резервирования.

Следует также помнить, что приложение позволяет разным пользователям видеть разные расписания одного и того же устройства. Например: пользователь А имеет 6-минутные интервалы, поэтому он может видеть свободный слот (12:00 - 12:06), а также свободный слот (12:06 - 12:12), но пользователь Б имеет 4-минутные интервалы, поэтому он также среди других видит слот (12:04 - 12:08). Каждый пользователь или группа пользователей может иметь различную длительность интервала. Поэтому я должен быть уверен, что, когда оба пользователя A и B отправят запрос с этими слотами, только один из них будет успешным. Что приводит меня к сделкам, а также мой вопрос.

Я делаю это так: - начать транзакцию - выбрать все слоты того дня - запустить алгоритм, который проверяет наличие временных коллизий между выбранными зарезервированными слотами и запрошенными слотами - если коллизий нет, вставьте новую строку (и) в таблицу слотов, в противном случае сигнализируйте об ошибке пользователю - совершить

Теперь вы знаете, что может произойти, когда он работает одновременно. Я новичок в транзакциях и MySQL, но попытался проверить это, и у меня есть основания полагать, что просто быть в транзакции недостаточно в этом случае, но я не уверен.

Поэтому мой вопрос: как я могу выбрать, проверить наличие коллизий и правильно сохранить резервирование в одной транзакции.

Спасибо

Ответы на вопрос(1)

Ваш ответ на вопрос