Ответ
Стандарт SQL (ANSI/ISO) определяет четыре уровня изоляции транзакций, которые контролируют видимость изменений, сделанных в параллельных транзакциях. Они представляют собой компромисс между согласованностью данных и производительностью.
Уровни перечислены от наименее строгого к наиболее строгому, и каждый последующий уровень предотвращает определенные аномалии:
-
READ UNCOMMITTED:
- Описание: Транзакция может читать данные, которые были изменены другой транзакцией, но еще не зафиксированы.
- Разрешенные аномалии: Грязное чтение (Dirty Read), Неповторяющееся чтение (Non-repeatable Read), Фантомное чтение (Phantom Read).
- На практике: Я практически никогда не использую этот уровень из-за риска чтения невалидных данных.
-
READ COMMITTED:
- Описание: Транзакция видит только зафиксированные данные других транзакций. Это уровень по умолчанию в PostgreSQL и Oracle.
- Предотвращает: Грязное чтение.
- Разрешенные аномалии: Неповторяющееся чтение, Фантомное чтение.
- Как работает: При повторном чтении одной и той же строки в рамках транзакции можно получить разные данные, если другая транзакция зафиксировала изменения этой строки.
-
REPEATABLE READ:
- Описание: Гарантирует, что любые строки, прочитанные в течение транзакции, будут оставаться неизменными до ее завершения. Другие транзакции не могут изменять или удалять эти строки.
- Предотвращает: Грязное чтение, Неповторяющееся чтение.
- Разрешенные аномалии: Фантомное чтение (хотя в некоторых СУБД, например, в MySQL/InnoDB и PostgreSQL, фантомы также предотвращаются на этом уровне).
- Уровень по умолчанию в MySQL (InnoDB).
-
SERIALIZABLE:
- Описание: Самый строгий уровень. Результат параллельного выполнения набора сериализуемых транзакций должен быть идентичен результату их последовательного выполнения.
- Предотвращает: Все аномалии: Грязное чтение, Неповторяющееся чтение, Фантомное чтение.
- На практике: Обеспечивает полную изоляцию, но за счет максимальных накладных расходов (блокировок или управления версиями), что может сильно снизить пропускную способность. Я использую его только для критических операций, где абсолютная согласованность важнее производительности.
Пример установки уровня в PostgreSQL:
-- Установка уровня для текущей транзакции
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- Операции SELECT, UPDATE, DELETE...
COMMIT;
-- Установка уровня по умолчанию для сессии
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED;
Выбор уровня зависит от требований приложения к согласованности и допустимых компромиссов с производительностью.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶