Проверяет понимание различий между уровнями изоляции транзакций Repeatable Read и Serializable в реляционных базах данных.
Уровни изоляции транзакций определяют, насколько одна транзакция видит изменения, сделанные другими. Repeatable Read и Serializable находятся на верхних ступенях шкалы изоляции, но различаются по строгости гарантий.
Repeatable Read гарантирует, что если транзакция читает строку, она не изменится другими транзакциями до её завершения. Однако при повторном выполнении запроса с условием (например, SELECT ... WHERE) могут появиться новые строки, добавленные другими транзакциями — это называется фантомным чтением.
Serializable — самый строгий уровень. Он полностью изолирует транзакции, как если бы они выполнялись последовательно. Это исключает фантомные чтения, аномалии записи и другие конфликты, но требует блокировок или механизмов оптимистичного контроля, что снижает производительность.
-- Транзакция 1 (Repeatable Read)
BEGIN;
SELECT * FROM orders WHERE amount > 100;
-- Транзакция 2 добавляет новую строку с amount = 200
COMMIT;
-- Повторный SELECT в транзакции 1 вернёт новую строку (фантом)
-- Транзакция 1 (Serializable)
BEGIN;
SELECT * FROM orders WHERE amount > 100;
-- Транзакция 2 пытается добавить строку, но блокируется до COMMIT
COMMIT;
-- Повторный SELECT не увидит новых строкRepeatable Read подходит для большинства бизнес-приложений, где важна консистентность чтения, но допустимы редкие фантомы. Serializable применяется в финансовых системах или при строгих требованиях к целостности данных, когда цена ошибки высока.
Вывод: выбор уровня изоляции — компромисс между консистентностью и производительностью. Serializable даёт максимальную надёжность, но требует больше ресурсов, поэтому его стоит использовать только там, где это действительно необходимо.