Спланируйте транзакции и выберите их уровни изоляции для базы данных Airline.
-- Аномалии:
-- - Косая запись - нет, read only
-- - Фантомная запись - нет, один SELECT
-- - Неповторяемое чтение - нет, один SELECT
-- - Грязное чтение - есть, можем прочитать, к примеру,
-- что место куплено, хотя транзакция не завершена
-- Избавляемся от аномалий:
-- - Грязное чтение
-- Достаточно уровня изоляции Read commited
START TRANSACTION READ ONLY ISOLATION LEVEL READ COMMITTED;
-- Аномалии:
-- - Косая запись - нет, изменяем данные только в Tickets
-- - Фантомная запись - нет, читаем один раз одну строчку из Tickets
-- - Неповторяемое чтение - есть, читаем несколько раз из Flights
-- - Грязное чтение - есть, можем прочитать, к примеру,
-- что место куплено, хотя транзакция не завершена
-- Избавляемся от аномалий:
-- - Неповторяемое чтение
-- - Грязное чтение
-- Достаточно уровня изоляции Repeatable read
START TRANSACTION READ WRITE ISOLATION LEVEL REPEATABLE READ;
-- Аномалии:
-- - Косая запись - нет, изменяем данные только в Tickets
-- - Фантомная запись - нет, не может произойти мешающие добавление данных в Tickets
-- - Неповторяемое чтение - есть, читаем несколько раз из Flights
-- - Грязное чтение - есть, можем прочитать, к примеру,
-- что место куплено, хотя транзакция не завершена
-- Избавляемся от аномалий:
-- - Неповторяемое чтение
-- - Грязное чтение
-- Достаточно уровня изоляции Repeatable read
START TRANSACTION READ WRITE ISOLATION LEVEL REPEATABLE READ;
-- Аномалии:
-- - Косая запись - нет, изменяем данные только в Tickets
-- - Фантомная запись - нет, читаем один раз одну строчку из Tickets
-- - Неповторяемое чтение - есть, читаем несколько раз из Flights
-- - Грязное чтение - есть, можем прочитать, к примеру,
-- что место куплено, хотя транзакция не завершена
-- Избавляемся от аномалий:
-- - Неповторяемое чтение
-- - Грязное чтение
-- Достаточно уровня изоляции Repeatable read
START TRANSACTION READ WRITE ISOLATION LEVEL REPEATABLE READ;
-- Аномалии:
-- - Косая запись - нет, изменяем данные только в Tickets
-- - Фантомная запись - нет, не может произойти мешающие добавление данных в Tickets
-- - Неповторяемое чтение - есть, читаем несколько раз из Flights
-- - Грязное чтение - есть, можем прочитать, к примеру,
-- что место куплено, хотя транзакция не завершена
-- Избавляемся от аномалий:
-- - Неповторяемое чтение
-- - Грязное чтение
-- Достаточно уровня изоляции Repeatable read
START TRANSACTION READ WRITE ISOLATION LEVEL REPEATABLE READ;
-- Аномалии:
-- - Косая запись - нет, read only
-- - Фантомная запись - нет, читаем один из Tickets
-- - Неповторяемое чтение - есть, читаем несколько раз из Flights
-- - Грязное чтение - есть, можем прочитать, к примеру,
-- что место куплено, хотя транзакция не завершена
-- Избавляемся от аномалий:
-- - Неповторяемое чтение
-- - Грязное чтение
-- Достаточно уровня изоляции Repeatable read
START TRANSACTION READ ONLY ISOLATION LEVEL REPEATABLE READ;
-- Аномалии:
-- - Косая запись - нет, изменяем данные только в Tickets
-- - Фантомная запись - нет, читаем один из Tickets
-- - Неповторяемое чтение - есть, читаем несколько раз из Flights
-- - Грязное чтение - есть, можем прочитать, к примеру,
-- что место куплено, хотя транзакция не завершена
-- Избавляемся от аномалий:
-- - Неповторяемое чтение
-- - Грязное чтение
-- Достаточно уровня изоляции Repeatable read
START TRANSACTION READ ONLY ISOLATION LEVEL REPEATABLE READ;
-- Аномалии:
-- - Косая запись - нет, изменяем данные только в Tickets
-- - Фантомная запись - есть, может произойти запись в Tickets
-- - Неповторяемое чтение - есть, читаем несколько раз из Flights
-- - Грязное чтение - есть, можем прочитать, к примеру,
-- что место куплено, хотя транзакция не завершена
-- Избавляемся от аномалий:
-- - Фантомная запись
-- - Неповторяемое чтение
-- - Грязное чтение
-- Достаточно уровня изоляции Snapshot
START TRANSACTION READ WRITE ISOLATION LEVEL SNAPSHOT;
START TRANSACTION READ ONLY ISOLATION LEVEL READ COMMITTED;
SELECT SeatNo, BookedUntil FROM FreeOrReservedTickets
WHERE FlightId = :FlightId
AND (UserId = :UserId OR UserId IS NULL);
COMMIT;
START TRANSACTION READ ONLY ISOLATION LEVEL SNAPSHOT;
SELECT Reserve(:UserId, :Pass, :FlightId, :SeatNo);
COMMIT;
START TRANSACTION READ ONLY ISOLATION LEVEL SNAPSHOT;
SELECT BuyFree(:FlightId, :SeatNo);
COMMIT;
START TRANSACTION READ ONLY ISOLATION LEVEL REPEATABLE READ;
SELECT ExtendReservation(:UserId, :Pass, :FlightId, :SeatNo);
COMMIT;
START TRANSACTION READ ONLY ISOLATION LEVEL REPEATABLE READ;
SELECT BuyReserved(:UserId, :Pass, :FlightId, :SeatNo);
COMMIT;