Sobes.tech
Senior

Quale comportamento si aspetta dal sistema utilizzando il livello di isolamento Repeatable Read durante l'aggiornamento concorrente di un conto da parte di due transazioni?

sobes.tech AI

Risposta dell'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);
}

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