Уровни изоляции транзакций SQL
Уровни изоляции транзакций
Уровень изоляции транзакции определяет степень независимости выполняемых транзакций друг от друга. Он влияет на конкурентный доступ к данным и балансирует между производительностью и целостностью данных.
Стандарт SQL определяет четыре уровня изоляции:
Уровень | Грязное чтение | Неповторяющееся чтение | Фантомное чтение |
---|---|---|---|
READ UNCOMMITTED | Да | Да | Да |
READ COMMITTED (по умолчанию в PostgreSQL, Oracle) | Нет | Да | Да |
REPEATABLE READ (по умолчанию в MySQL) | Нет | Нет | Да |
SERIALIZABLE | Нет | Нет | Нет |
1. READ UNCOMMITTED (Чтение неподтверждённых данных)
Транзакция может читать данные, которые ещё не зафиксированы (COMMIT) в другой транзакции.
Плюсы:
- Минимальная блокировка, высокая скорость работы.
Минусы:
- Возможны грязные чтения (dirty reads) — чтение неподтвержденных изменений, которые могут быть откатаны (ROLLBACK).
Пример в PostgreSQL:
1 2 |
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; |
2. READ COMMITTED (Чтение подтверждённых данных)
Транзакция читает только те данные, которые уже зафиксированы (COMMIT).
Плюсы:
- Исключает грязное чтение.
- Высокая производительность.
Минусы:
- Возможны неповторяющиеся чтения (non-repeatable read), когда один и тот же запрос внутри транзакции возвращает разные данные, если параллельная транзакция изменила и закоммитила их.
Пример в PostgreSQL:
1 2 |
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; |
3. REPEATABLE READ (Повторяемость чтения)
Транзакция фиксирует состояние строк на момент первого чтения и всегда видит одни и те же данные, даже если другая транзакция их изменила.
Плюсы:
- Исключает грязное чтение и неповторяющееся чтение.
Минусы:
- Возможны фантомные чтения (phantom reads), если другая транзакция добавит новые строки.
Пример в PostgreSQL:
1 2 |
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; |
4. SERIALIZABLE (Полная изоляция)
Максимальная изоляция — транзакции выполняются как будто по очереди.
Плюсы:
- Исключает грязные, неповторяющиеся и фантомные чтения.
- Гарантирует целостность данных.
Минусы:
- Сильное падение производительности из-за блокировок и возможных откатов транзакций.
Пример в PostgreSQL:
1 2 |
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; |
Какой уровень выбрать?
Уровень | Когда использовать? |
---|---|
READ UNCOMMITTED | Не рекомендуется (только для аналитики, где важна скорость, а не точность). |
READ COMMITTED | Подходит для большинства систем. Хороший баланс между изоляцией и производительностью. |
REPEATABLE READ | Используется, если важно защититься от изменения уже прочитанных данных (например, при обработке заказов). |
SERIALIZABLE | Применяется, когда нужна максимальная защита (например, в банковских операциях). |
Recommended Posts
Как загрузить SQL дамп базы в Laravel?
30.08.2021