Изоляция транзакций влияет на то, как одновременные транзакции видят изменения друг друга. Это важная часть ACID-свойств. В ANSI SQL четыре базовых уровня изоляции:
Выбор уровня зависит от требований приложения:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; -- Дальнейшие SELECT будут видеть "замороженные" значения
"Гарантирует ли уровень REPEATABLE READ защиту от фантомных чтений в любой БД?"
Нет. В PostgreSQL и некоторых других СУБД уровень REPEATABLE READ предотвращает только грязные и неповторимые чтения, но не обязательно защищает от фантомных чтений. В MySQL/InnoDB REPEATABLE READ — по сути SERIALIZABLE, но в других СУБД — нет.
-- В одной транзакции читаем SELECT * FROM orders WHERE amount > 100; -- В другой транзакции вставлено новое значение с amount > 100 и коммитится -- Первая транзакция при повторном SELECT увидит "фантомную" строку, если изоляция ниже SERIALIZABLE
История
Финансовый сервис заблокировал только READ COMMITTED ради производительности — пользователь увидел сумму, которую уже изменил другой процесс, появились расхождения баланса.
История
В системе бронирования отелей происходили двойные бронирования одного и того же номера — транзакции не изолировали выгрузку актуальных броней, уровень был READ COMMITTED.
История
Переход c MySQL на PostgreSQL: разработчик привык, что REPEATABLE READ защищает от фантомов, но после миграции появились "зависшие" заказы, которых не ожидали увидеть при повторных запросах в одной и той же транзакции.