Ответ
В проекте по умолчанию использовался уровень изоляции READ_COMMITTED. Этот выбор представлял собой баланс между согласованностью данных и производительностью.
Почему READ_COMMITTED?
- Гарантирует защиту от "грязного чтения" (dirty reads): транзакция видит только зафиксированные изменения других транзакций.
- Обеспечивает хорошую производительность по сравнению с более строгими уровнями (
REPEATABLE_READ,SERIALIZABLE). - Допускает "неповторяемое чтение" (non-repeatable reads) и "фантомы" (phantoms), что было приемлемо для большинства бизнес-сценариев.
Пример настройки в Spring (@Transactional):
@Service
public class OrderService {
@Transactional(isolation = Isolation.READ_COMMITTED) // Явное указание уровня
public void processOrder(Order order) {
// Бизнес-логика, работающая с БД
}
}
Для особых случаев (например, финансовые операции, где критична абсолютная согласованность) применялся уровень SERIALIZABLE. Его использование требовало:
- Тщательного проектирования схемы данных и индексов.
- Коротких транзакций для минимизации риска deadlock.
- Явного анализа влияния на производительность под нагрузкой.
Выбор уровня изоляции всегда является компромиссом и должен быть обоснован требованиями конкретного функционала.