| layout | default | |||
|---|---|---|---|---|
| title | 🔒 Какие бывают уровни изоляции транзакций и зачем они нужны? | |||
| description | ||||
| author | Dvurechensky | |||
| date | 2025-08-28 | |||
| published | true | |||
| tags |
|
- ✨ Оглавление
Транзакции обеспечивают ACID:
- A — Atomicity (атомарность)
- C — Consistency (согласованность)
- I — Isolation (изоляция)
- D — Durability (надёжность)
Isolation определяет, как изменения одной транзакции видны другим транзакциям.
Без корректной изоляции:
- Возможны грязные чтения (dirty read).
- Возможны неповторяемые чтения (non-repeatable read).
- Возможны фантомные чтения (phantom read).
| Проблема | Пример | Опасность |
|---|---|---|
| Dirty read | Транзакция B читает данные, которые транзакция A ещё не зафиксировала и потом откатила | B получает неконсистентные данные |
| Non-repeatable read | Транзакция B меняет данные между двумя чтениями транзакции A | Чтения A различаются → ошибки логики |
| Phantom read | Транзакция B вставляет новые строки, которые попадают в выборку транзакции A | A видит «фантомные» строки при повторном SELECT |
- Суть: самая слабая изоляция, транзакция видит незавершённые изменения других транзакций.
- Проблемы: допускает dirty read, non-repeatable read и phantom read.
- Пример:
using var transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted);-
Особенности:
- Используется для отчётности, где важна скорость, а данные могут быть «грязными».
-
Каверзный момент: SQL Server может не блокировать таблицы → быстро, но ненадёжно.
-
Суть: транзакция видит только зафиксированные данные.
-
Проблемы: допускает non-repeatable read и phantom read, но нет dirty read.
-
Особенности:
- SQL Server использует блокировки чтения (shared lock).
- Можно включить Read Committed Snapshot Isolation → уменьшение блокировок через versioning.
-
Каверзный момент: многие думают, что Read Committed гарантирует повторяемое чтение — нет.
-
Суть: транзакция гарантирует, что все прочитанные данные не изменятся другими транзакциями до конца.
-
Проблемы: допускает фантомные строки (новые INSERT могут появиться).
-
Особенности:
- SQL Server ставит shared lock на прочитанные строки до конца транзакции.
-
Каверзный момент: блокировки могут увеличить конкуренцию, риск deadlock.
-
Суть: самая строгая изоляция, транзакции выполняются так, как если бы они были последовательными.
-
Проблемы: минимизирует все аномалии: нет dirty read, non-repeatable read, phantom read.
-
Особенности:
- Используются range-lock для предотвращения фантомных строк.
-
Каверзный момент: снижает параллелизм, высокие блокировки → медленные транзакции при большой нагрузке.
-
Суть: каждая транзакция видит снимок данных на момент её начала.
-
Проблемы: нет dirty read, нет non-repeatable read, нет фантомов.
-
Особенности:
- Использует versioning (tempdb хранит старые версии строк).
- Хорошо подходит для отчётности и параллельных чтений.
-
Каверзный момент: высокая нагрузка на tempdb при большом числе изменений.
| Уровень | Dirty Read | Non-repeatable Read | Phantom Read | Производительность |
|---|---|---|---|---|
| Read Uncommitted | ✅ | ✅ | ✅ | высокая |
| Read Committed | ❌ | ✅ | ✅ | средняя |
| Repeatable Read | ❌ | ❌ | ✅ | ниже |
| Serializable | ❌ | ❌ | ❌ | низкая |
| Snapshot | ❌ | ❌ | ❌ | зависит от versioning |
Каверзный момент: «повышение» уровня изоляции → блокировки растут, производительность падает, deadlock риск увеличивается.
- Для Web API / отчётности: часто хватает
Read CommittedилиSnapshotдля быстрого чтения. - Для банковских транзакций:
SerializableилиRepeatable Read→ консистентность. - Для массовых обновлений: избегать Serializable → риск блокировок.
- EF Core примеры:
using var transaction = await context.Database.BeginTransactionAsync(System.Data.IsolationLevel.RepeatableRead);- Deadlock prevention: короткие транзакции, единый порядок захвата ресурсов.
✨Dvurechensky✨