Какое поведение системы ожидается при использовании уровня изоляции 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);
}
Если две такие транзакции запустятся одновременно, одна из них будет ждать завершения другой при обновлении одного и того же счёта.