INSERT INTO ticket_flights
( ticket_no, flight_id, fare_conditions, amount )
VALUES ( '9991234567891', 5572, 'Business', 12500 );
INSERT 0 1
UPDATE bookings
SET total_amount = 12500
WHERE book_ref = 'ABC456';
UPDATE 1
290
Контрольные вопросы и задания
COMMIT;
ОШИБКА: не удалось сериализовать доступ из-за зависимостей
чтения/записи между транзакциями
ПОДРОБНОСТИ: Reason code: Canceled on identification as a pivot,
during commit attempt.
ПОДСКАЗКА: Транзакция может завершиться успешно при следующей
попытке.
Задание 1.
Попытайтесь объяснить, почему транзакции не удалось сериа-
лизовать. Что можно сделать, чтобы удалось зафиксировать обе транзакции?
Одно из возможных решений — понизить уровень изоляции. Другим ре-
шением может быть создание индекса по столбцу flight_id для таблицы
ticket_flights. Почему создание индекса может помочь? Обратитесь за
разъяснениями к разделу документации 13.2.3 «Уровень изоляции Serializable».
Задание 2.
В первой транзакции условие в команде SELECT такое: ... WHERE
flight_id = 13881. В команде вставки в таблицу ticket_flights значение
поля flight_id также равно 13881. Во второй транзакции в этих же командах
используется значение 5572. Поменяйте местами значения в командах SELECT
и повторите эксперименты, выполнив транзакции параллельно с уровнем изо-
ляции Serializable. Почему сейчас наличие индекса не помогает зафиксировать
обе транзакции? Вспомните, что аномалия сериализации — это ситуация, когда
параллельное выполнение транзакций приводит к результату, невозможному
ни при каком из вариантов упорядочения этих же транзакций при их последо-
вательном выполнении.
291
|