'PETR IVANOV' );
INSERT 0 1
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
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 значение поля
226
flight_id также равно 13881. Во второй транзакции в этих же командах исполь-
зуется значение 5572. Поменяйте местами значения в командах SELECT и по-
вторите эксперименты, выполнив транзакции параллельно с уровнем изоляции
SERIALIZABLE. Почему сейчас наличие индекса не помогает зафиксировать обе
транзакции? Вспомните, что аномалия сериализации — это ситуация, когда па-
раллельное выполнение транзакций приводит к результату, невозможному ни
при каком из вариантов упорядочения этих же транзакций при их последова-
тельном выполнении.
227
|