Ответ
Снижение уровня изоляции — это осознанный компромисс, на который я иду для увеличения пропускной способности (throughput) и уменьшения блокировок в высоконагруженных системах. Более строгие уровни (REPEATABLE READ, SERIALIZABLE) обеспечивают предсказуемость, но требуют больше ресурсов и могут приводить к дедлокам.
Конкретный пример из моей практики с PostgreSQL:
У нас была очередь фоновых задач, где множество воркеров параллельно выбирали «свободные» задачи. Уровень REPEATABLE READ вызывал частые сериализационные сбои. Мы перешли на READ COMMITTED и использовали SELECT ... FOR UPDATE SKIP LOCKED для безопасного выбора задач:
BEGIN;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT * FROM background_jobs
WHERE status = 'pending'
ORDER BY created_at
FOR UPDATE SKIP LOCKED
LIMIT 1;
-- ... обработка задачи
UPDATE background_jobs SET status = 'processing' WHERE id = ...;
COMMIT;
Риски, которые я учитываю:
- Неповторяющееся чтение (Non-repeatable Read): Данные могут измениться между двумя чтениями внутри одной транзакции. Это допустимо для агрегации аналитики, но не для финансовых операций.
- Фантомное чтение (Phantom Read): Могут появиться новые строки, удовлетворяющие условию. Это критично, если логика зависит от количества строк.
Я снижаю изоляцию только для конкретных, хорошо изолированных операций, где эти аномалии не нарушают бизнес-логику.