9.5 Пример использования транзакций Продемонстрируем использование транзакций на примере базы данных «Авиапере-
возки». Для этого создадим новое бронирование и оформим два билета с двумя пе-
релетами в каждом. Выберем в качестве уровня изоляции READ COMMITTED.
BEGIN; BEGIN;
Сначала добавим запись в таблицу «Бронирования», причем, значение поля
total_amount назначим равным 0. После завершения ввода строк в таблицу «Пере-
леты» мы обновим это значение: оно станет равным сумме стоимостей всех забро-
нированных перелетов. В качестве даты бронирования возьмем дату, которая была
принята в качестве текущей в базе данных. Эту дату выдает функция now(), созданная
в схеме bookings.
INSERT INTO bookings ( book_ref, book_date, total_amount ) VALUES ( 'ABC123', bookings.now(), 0 ); INSERT 0 1
Оформим два билета на двух разных пассажиров.
INSERT INTO tickets ( ticket_no, book_ref, passenger_id, passenger_name) VALUES ( '9991234567890', 'ABC123', '1234 123456', 'IVAN PETROV' ); INSERT 0 1
INSERT INTO tickets ( ticket_no, book_ref, passenger_id, passenger_name) VALUES ( '9991234567891', 'ABC123', '4321 654321', 'PETR IVANOV' ); INSERT 0 1
Отправим обоих пассажиров по маршруту Москва — Красноярск и обратно.
INSERT INTO ticket_flights ( ticket_no, flight_id, fare_conditions, amount ) VALUES ( '9991234567890', 5572, 'Business', 12500 ), ( '9991234567890', 13881, 'Economy', 8500 ); INSERT 0 2
INSERT INTO ticket_flights ( ticket_no, flight_id, fare_conditions, amount ) VALUES ( '9991234567891', 5572, 'Business', 12500 ), ( '9991234567891', 13881, 'Economy', 8500 ); 215
INSERT 0 2
Подсчитаем общую стоимость забронированных билетов и запишем ее в строку таб-
лицы «Бронирования». Конечно, если такая транзакция выполняется в рамках при-
кладной программы, то возможно, что подсчет общей суммы будет выполняться в
этой программе. Тогда в команде UPDATE уже не потребуется выполнять подзапрос,
а будет использоваться заранее вычисленное значение. Но более надежным решени-
ем было бы использование триггера для увеличения значения поля total_amount при
каждом добавлении строки в таблицу ticket_flights. Триггеры будут рассмотрены во
второй части учебного пособия.