# Уровни изоляции транзакций. Модели конкурентного доступа.

PostgreSQL поддерживает несколько уровней изоляции, которые определяют, как транзакции видят изменения других транзакций. Уровни изоляции регулируют конкурентный доступ к данным.

⸻

#### Уровни изоляции

1. Read Uncommitted (Чтение незафиксированных данных)
    - Самый низкий уровень изоляции.
    - Транзакции могут видеть незафиксированные изменения других транзакций.
2. Read Committed (Чтение зафиксированных данных)
    - Транзакции видят только зафиксированные изменения.
    - Уровень по умолчанию в PostgreSQL.
3. Repeatable Read (Повторяемое чтение)
    - Гарантирует, что данные, прочитанные в транзакции, не изменятся другими транзакциями до ее завершения.
    - Полезно для предотвращения фантомного чтения.
4. Serializable (Сериализуемый)
    - Самый строгий уровень изоляции.
    - Гарантирует, что параллельные транзакции выполняются так, как если бы они шли последовательно.

| Уровень изоляции        | Dirty Read | Non-Repeatable Read | Phantom Read |
|-|:-:|:-:|:-:|
| **Read Uncommitted**    | ❌         | ❌                | ❌           |
| **Read Committed**      | ✅         | ❌                | ❌           |
| **Repeatable Read**     | ✅         | ✅                | ❌           |
| **Serializable**        | ✅         | ✅                | ✅           |

> **Dirty Read** (Грязное чтение) — транзакция читает незафиксированные изменения другой транзакции. Если та откатится, данные окажутся неверными.
> 
> **Non-Repeatable Read** (Неповторяемое чтение) — данные, прочитанные транзакцией, могут измениться другой транзакцией до её завершения.
> 
> **Phantom Read** (Фантомное чтение) — при повторном выполнении запроса могут появляться или исчезать новые строки, добавленные или удалённые другими транзакциями.

Пример установки уровня изоляции:

```sql
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- Операции внутри транзакции
SELECT * FROM accounts WHERE user_id = 1;
COMMIT;
```

⸻

#### Модели конкурентного доступа

1. Оптимистический (версионированный)
    - Проверка конфликтов после выполнения действия.
    - Пример: пользователь изменяет данные и пытается сохранить изменения. Если версия данных совпадает с текущей — операция проходит, иначе — конфликт, который обрабатывается повторным выполнением или откатом.
2. Пессимистический (с блокировками)
    - Проверка конфликтов до выполнения действия.
    - Потоки сериализуются на защищаемой области данных (блокируются).
3. Частично-оптимистический (смешанный)
    - Комбинирует оба подхода: часть операций проверяется заранее, часть — после выполнения.