9.6. Пример использования транзакций
Продемонстрируем использование транзакций на примере базы данных «Авиапе-
ревозки». Для этого создадим новое бронирование и оформим два билета с двумя
перелетами в каждом. Выберем в качестве уровня изоляции Read Committed.
BEGIN;
BEGIN;
275
Глава 9. Транзакции
Сначала добавим запись в таблицу «Бронирования», причем назначим значение по-
ля 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 );
INSERT 0 2
Подсчитаем общую стоимость забронированных билетов и запишем ее в строку таб-
лицы «Бронирования». Конечно, если такая транзакция выполняется в рамках при-
кладной программы, то возможно, что подсчет общей суммы будет выполняться
в этой программе. Тогда в команде UPDATE уже не потребуется выполнять подзапрос,
а будет использоваться заранее вычисленное значение. Но более надежным решени-
ем было бы использование триггера для увеличения значения поля total_amount
276
9.6. Пример использования транзакций
при каждом добавлении строки в таблицу ticket_flights, но в этом учебном по-
собии они не рассматриваются.
Достарыңызбен бөлісу: |