← Назад к вопросам

Какие знаешь уровни изоляций в БД?

1.7 Middle🔥 141 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Какие знаешь уровни изоляций в БД?

Уровни изоляции (Isolation Levels) определяют, как одновременные транзакции влияют друг на друга.

Проблемы параллельных транзакций

1. Dirty Read - грязное чтение

Одна транзакция читает незафиксированные изменения другой.

2. Non-Repeatable Read - неповторяемое чтение

Транзакция читает одни и те же данные дважды и получает разные значения.

3. Phantom Read - привидение

Транзакция видит появление новых строк между запросами.

Четыре уровня изоляции

1. Read Uncommitted (Чтение грязных данных)

Самый слабый уровень.

Проблемы: Dirty Reads, Non-Repeatable Reads, Phantom Reads Преимущества: Максимальная производительность Использование: Редко

2. Read Committed (Чтение фиксированных данных)

По умолчанию в большинстве СУБД.

Проблемы: Non-Repeatable Reads, Phantom Reads Преимущества: Читаются только коммитёные данные

@Transactional(isolation = Isolation.READ_COMMITTED)
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
    Account from = findById(fromId);
    Account to = findById(toId);
    from.debit(amount);
    to.credit(amount);
}

3. Repeatable Read (Повторяемое чтение)

Промежуточный уровень.

Проблемы: Phantom Reads Преимущества: Гарантирует консистентность данных внутри транзакции

@Transactional(isolation = Isolation.REPEATABLE_READ)
public void createOrder(Order order) {
    List<Items> items = itemRepository.findAll();
}

4. Serializable (Сериализуемость)

Самый строгий уровень.

Гарантии: Нет Dirty Reads, Non-Repeatable Reads и Phantom Reads Недостатки: Очень медленно, много блокировок, риск deadlock'ов

@Transactional(isolation = Isolation.SERIALIZABLE)
public void transferFunds(Long fromId, Long toId, BigDecimal amount) {
    Account from = findById(fromId);
    Account to = findById(toId);
    if (from.getBalance().compareTo(amount) >= 0) {
        from.debit(amount);
        to.credit(amount);
    }
}

Сравнительная таблица

УровеньDirty ReadNon-Rep ReadPhantom ReadПроизводительность
Read UncommittedДаДаДаОчень быстро
Read CommittedНетДаДаБыстро
Repeatable ReadНетНетДаМедленно
SerializableНетНетНетОчень медленно

Практический пример

@Service
public class BankingService {
    @Transactional(isolation = Isolation.SERIALIZABLE)
    public void transfer(Long fromId, Long toId, BigDecimal amount) {
        Account from = findById(fromId);
        Account to = findById(toId);
        from.withdraw(amount);
        to.deposit(amount);
    }
    
    @Transactional(isolation = Isolation.READ_COMMITTED, readOnly = true)
    public BigDecimal getTotalBalance() {
        return accountRepository.sumAllBalances();
    }
}

Выбор уровня изоляции

  • READ_UNCOMMITTED: статистика, кэш
  • READ_COMMITTED: стандартный выбор
  • REPEATABLE_READ: когда нужна консистентность
  • SERIALIZABLE: финансовые операции

Уровни изоляции - компромисс между целостностью данных и производительностью.