Ответ
Уровень изоляции по умолчанию в PostgreSQL — READ COMMITTED. В большинстве случаев я придерживаюсь его, так как он обеспечивает хороший баланс между согласованностью, производительностью и простотой понимания.
| Сравнение уровней изоляции в PostgreSQL: | Уровень | Неповторяемое чтение | Фантомное чтение | Сериализация | Производительность |
|---|---|---|---|---|---|
READ COMMITTED (по умолчанию) |
Возможно | Возможно | Нет | Высокая | |
REPEATABLE READ |
Запрещено | Запрещено (в PG) | Нет | Средняя | |
SERIALIZABLE |
Запрещено | Запрещено | Гарантирована | Низкая |
Почему READ COMMITTED часто достаточно?
- Каждая инструкция в транзакции видит снимок данных, зафиксированный на момент ее начала. Это защищает от "грязного" чтения.
- Поведение предсказуемо и соответствует ожиданиям многих разработчиков.
- Конфликты сериализации редки в типичных веб-приложениях с короткими транзакциями.
Когда повышать уровень?
REPEATABLE READ: Когда в рамках одной транзакции критически важно несколько раз прочитать одни и те же строки и получить идентичный результат (например, сложные финансовые отчеты).SERIALIZABLE: Для самых строгих требований, когда параллельное выполнение транзакций должно давать результат, идентичный их последовательному выполнению. Готовность обрабатывать ошибкиSQLSTATE 40001(serialization failure).
Пример установки уровня:
BEGIN;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- SELECT ... UPDATE ...
COMMIT;
-- Или на уровне соединения
ALTER DATABASE mydb SET default_transaction_isolation = 'REPEATABLE READ';
Выбор уровня — это всегда компромисс между целостностью данных и пропускной способностью.