Что такое уровень изоляции транзакций Serializable?

«Что такое уровень изоляции транзакций Serializable?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Serializable — самый строгий уровень изоляции транзакций, который гарантирует их последовательное выполнение, как если бы они выполнялись одна за другой.

Гарантии: ✅ Защита от "грязного" чтения (Dirty Read) ✅ Защита от неповторяемого чтения (Non-repeatable Read) ✅ Защита от фантомного чтения (Phantom Read)

Реализации в разных СУБД:

1. PostgreSQL (на основе MVCC):

BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT * FROM accounts WHERE balance > 1000;
-- Если другая транзакция добавит/изменит данные,
-- эта транзакция получит ошибку сериализации
COMMIT;

Использует оптимистичные блокировки — проверяет конфликты при коммите.

2. SQL Server (на основе блокировок):

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT * FROM accounts WHERE balance > 1000;
-- Устанавливает диапазонные блокировки (range locks)
COMMIT;

Использует пессимистичные блокировки — блокирует данные заранее.

Преимущества:

  • Полная изоляция и предсказуемость
  • Идеально для финансовых операций

Недостатки:

  • ⚠️ Низкая производительность из-за блокировок/откатов
  • ⚠️ Риск deadlock и ошибок сериализации
  • ⚠️ Сложность масштабирования

Практическое правило: используйте Serializable только для критически важных операций, где абсолютная согласованность важнее производительности.