Как ответить
Уровень изоляции транзакции — это настройка, которая определяет, насколько одна транзакция видит изменения, сделанные другими одновременно выполняющимися транзакциями. Стандарт SQL определяет четыре уровня, каждый из которых решает определённый набор проблем параллельного доступа: грязное чтение, неповторяющееся чтение и фантомное чтение.
- Read Uncommitted — минимальный уровень изоляции. Транзакция может читать данные, которые ещё не зафиксированы другими транзакциями (грязное чтение). На практике почти не используется: в PostgreSQL этот уровень эквивалентен Read Committed, в MySQL — работает как описано.
- Read Committed — гарантирует, что читаются только зафиксированные данные. Грязное чтение исключено, но возможны неповторяющееся чтение (повторный запрос внутри одной транзакции может вернуть другой набор строк) и фантомы (при повторном запросе с условием могут появиться новые строки, добавленные другой транзакцией). Это уровень по умолчанию в PostgreSQL, Oracle, SQL Server.
- Repeatable Read — гарантирует, что данные, прочитанные в рамках транзакции, не изменятся другими транзакциями (блокирует обновление уже прочитанных строк). Грязное и неповторяющееся чтение исключены, но фантомы остаются. В MySQL (InnoDB) этот уровень по умолчанию, причём фантомы там тоже блокируются за счёт gap locks.
- Serializable — самый строгий уровень. Транзакции выполняются так, как если бы они шли последовательно. Полностью исключает грязное чтение, неповторяющееся чтение и фантомы. Обычно реализуется либо через блокировки на весь диапазон, либо через оптимистичные проверки (SSI в PostgreSQL). Цена — резкое падение производительности из-за конфликтов.
Пример установки уровня изоляции в PostgreSQL:
BEGIN;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT balance FROM accounts WHERE id = 1;
-- другая транзакция не может изменить эту строку до завершения нашей
COMMIT;На практике выбор уровня — это компромисс между консистентностью данных и производительностью. Большинству приложений хватает Read Committed, а для финансовых операций или отчётов, где важна повторяемость чтения, используют Repeatable Read или Serializable.