Ответ
Для смешанного сценария (пользователи + администратор) также оптимален уровень READ_COMMITTED.
Почему READ_COMMITTED — лучший баланс:
- Для пользователей: Гарантирует, что они не увидят "грязных" данных от незавершённых правок администратора или других пользователей.
- Для администратора: Позволяет изменять любые строки без необходимости блокировать всю таблицу (как в
SERIALIZABLE), обеспечивая высокую производительность администрирования. - Для системы: Максимальная параллельность операций.
Пример разделения логики:
// Сервис для пользователя
@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.