Sobes.tech
Senior
32

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

Сұралған компаниялар
СовкомбанкСовкомбанк

AI-дан жауап

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);
}

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