Transacción MySQL: SELECCIONAR + INSERTAR

Estoy construyendo una aplicación web - sistema de reservas usando php y mysql. El sistema permitirá a los usuarios hacer reservas de intervalos de tiempo en algunos dispositivos (tiempo del usuario trabajando en ese dispositivo).

Llamo a estos intervalos de tiempo reservados. Las ranuras se almacenan en la tabla de base de datos mysql de esta manera:

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 ;  

(esta tabla se crea automáticamente por redbean orm y todavía no la optimicé)

Entonces, cuando el usuario crea una reserva, se inserta una nueva fila en esta tabla. En las columnas de inicio, final, mantengo las marcas de tiempo unix de inicio y final de cada reserva.

Otra cosa a tener en cuenta es que la aplicación permite que diferentes usuarios vean diferentes horarios de un mismo dispositivo. Por ejemplo: el usuario A tiene intervalos de 6 minutos para que pueda ver el espacio libre (12:00 - 12:06) y también el espacio libre (12:06 - 12:12), pero el usuario B tiene intervalos de 4 minutos, así que él También entre otros ve ranura (12:04 - 12:08). Cada usuario o grupo de usuarios puede tener diferentes duraciones de intervalo. Por lo tanto, debo asegurarme de que cuando los usuarios A y B envían solicitudes con esos espacios, solo uno de ellos tiene éxito. Lo que me lleva a las transacciones y también a mi pregunta.

Lo hago así: - iniciar la transacción - seleccionar todos los espacios de ese día - ejecutar un algoritmo que verifique las colisiones de tiempo entre los espacios reservados seleccionados y los espacios solicitados - si no hay colisión, inserte nuevas filas en la tabla de espacios, de lo contrario, indique un error al usuario - commit

Ahora ya sabe lo que puede suceder cuando se ejecuta simultáneamente. Soy nuevo en transacciones y mysql, pero intenté probarlo y tengo razones para creer que solo estar en una transacción no es suficiente en este caso, pero no estoy seguro.

Entonces mi pregunta es: ¿cómo puedo seleccionar, verificar las colisiones y almacenar la reserva en una transacción correctamente?

Gracias

Respuestas a la pregunta(1)

Su respuesta a la pregunta