Какой уровень изоляции выбрать для таблицы пользователей, если пользователи редактируют свои данные, а администратор — любые?

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

Ответ

Для смешанного сценария (пользователи + администратор) также оптимален уровень READ_COMMITTED.

Почему READ_COMMITTED — лучший баланс:

  1. Для пользователей: Гарантирует, что они не увидят "грязных" данных от незавершённых правок администратора или других пользователей.
  2. Для администратора: Позволяет изменять любые строки без необходимости блокировать всю таблицу (как в SERIALIZABLE), обеспечивая высокую производительность администрирования.
  3. Для системы: Максимальная параллельность операций.

Пример разделения логики:

// Сервис для пользователя
@Transactional(isolation = Isolation.READ_COMMITTED)
public void updateOwnProfile(Long userId, UserData data) {
    // Логика с проверкой, что userId совпадает с ID в базе
}

// Сервис для администратора
@Transactional(isolation = Isolation.READ_COMMITTED)
public void updateAnyUserByAdmin(Long targetUserId, UserData data) {
    // Логика обновления любого пользователя
}

Если администратору необходимо выполнять согласованные аналитические отчеты (где важна защита от фантомного чтения), для этих конкретных операций можно использовать REPEATABLE_READ.