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

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

Ответ

Для сценария персонального редактирования профиля оптимален уровень READ_COMMITTED.

Обоснование:

  • Достаточная гарантия: Предотвращает грязное чтение — пользователь не увидит незакоммиченные изменения другого пользователя.
  • Высокая производительность: Минимальные блокировки, высокая параллельность операций.
  • Аномалии допустимы: "Неповторяемое чтение" (если пользователь дважды прочитает свой профиль в одной транзакции и увидит разное) и "фантомное чтение" в данном контексте некритичны.

Пример (Spring):

@Transactional(isolation = Isolation.READ_COMMITTED)
public void updateMyProfile(Long userId, ProfileUpdateRequest request) {
    User user = userRepository.findById(userId).orElseThrow();
    // Пользователь изменяет только свои поля
    user.setName(request.getName());
    user.setEmail(request.getEmail());
    userRepository.save(user);
}

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