Sobes.tech
Назад к вопросам
Senior
11

Какое поведение системы ожидается при использовании уровня изоляции Repeatable Read при конкурентном обновлении одного счёта двумя транзакциями?

Компании, где спрашивали
СовкомбанкСовкомбанк

Ответ от нейросети

sobes.tech AI

При уровне изоляции Repeatable Read транзакция гарантирует, что все данные, прочитанные в начале транзакции, останутся неизменными до её завершения. Если две транзакции пытаются одновременно обновить один и тот же счёт, то поведение будет следующим:

  • Первая транзакция, которая начнёт обновление и зафиксирует изменения, получит блокировку на запись.
  • Вторая транзакция при попытке обновления того же счёта будет ожидать освобождения блокировки или получит ошибку блокировки (в зависимости от СУБД и настроек).

Таким образом, Repeatable Read предотвращает неповторяющиеся чтения и обеспечивает, что данные, прочитанные в начале транзакции, не изменятся, но не гарантирует отсутствие фантомных чтений. В контексте конкурентного обновления это означает, что одна транзакция будет ждать или откатится, чтобы избежать конфликтов обновления.

Пример на Java с использованием Spring и JPA:

@Transactional(isolation = Isolation.REPEATABLE_READ)
public void updateAccount(Long accountId, BigDecimal amount) {
    Account account = accountRepository.findById(accountId).orElseThrow();
    account.setBalance(account.getBalance().add(amount));
    accountRepository.save(account);
}

Если две такие транзакции запустятся одновременно, одна из них будет ждать завершения другой при обновлении одного и того же счёта.