- CONNECT
- DISCONNECT
- TRANSACTION START
- TRANSACTION COMMIT
- TRANSACTION ROLLBACK
Окно работает на своей транзакции, которая по итогу или комитится -- кнопка Ок, или отменяется.
Периоды бронирования заносятся в отдельную таблицу (назовем её BOOKINGS). Здесь хранятся начало, окончание, ссылка на номер и ссылка на клиента. Перед добавлением записи происходит проверка не занят ли уже данный интервал.
В редких случаях возможна ситуация, когда два оператора одновременно распределят один и тот же номер на пересекающиеся интервалы. Так как в момент проверки транзакция не увидит запись, добавленную в BOOKINGS другой, еще не подтвержденной, транзакцией.
В такой ситуации на помощь приходит триггер на комит транзакции. Сначала, триггером на добавление/изменений записей в таблице бронирования мы выставим флаг о необходимости проверки при комите текущей транзакции:
CREATE OR ALTER TRIGGER after_ins_update
FOR bookings
ACTIVE
AFTER INSERT OR UPDATE
POSITION 32000
AS BEGIN
RDB$SET_CONTEXT('user_transaction', 'check_tr', 1);
END
Затем, если флаг выставлен, сделаем проверку корректности данных:
CREATE OR ALTER TRIGGER transaction_check
ACTIVE
ON TRANSACTION COMMIT
POSITION 32000
AS BEGIN
IF (RDB$GET_CONTEXT('user_transaction', 'check_tr') = 1) THEN
BEGIN
-- проверяем не пересекаются ли интервалы
-- если пересекаются, то вызываем EXCEPTION
END
END
В тексте исключения можно подробно указать пользователю с каким именно бронированием возник конфликт.