本文介绍: 这意味着它只能看到查询开始前提交的数据,而看不到未提交的数据或查询执行期间并发事务提交的更改。因此,更新方法遵循自己的事务定义。如果有任何脏写入,事务将中止,客户端可以使用新版本重新尝试事务。使用本地更新查询,在数据库中执行直接更新,而不是使用普通 ORM 风格的 “选择、修改和保存”。将其与retry 重试模板一起使用,这样它就会不断重试,直到获得主键锁的指定超时为止。因此,我们使用了自定义更新方法,而不是通常的保存方法。的更新可能会丢失,因为其他事务会用其结果覆盖它。事务时,会发生丢失更新异常。
当有多个并发事务时,会发生丢失更新异常。来自一个或多个事务的更新可能会丢失,因为其他事务会用其结果覆盖它。
让我们通过一个例子来检验一下。考虑以下执行事务的方法。
public void withdraw(Long accountId, double amount) {
Account account = accountRepository.findById(accountId).orElseThrow(() -> {
throw new IllegalStateException(“account does not exist: ” + accountId);
});
double newBalance = (account.getBalance() – amount);
if (newBalance < 0) {
throw new IllegalStateException(“there’s not enough balance”);
}
account.setBalance(newBalance);
accountRepository.save(account);
}
只要在任何给定时间点只有单个事务交易,这段代码会按预期工作。
当有多个同时事务时会发生什么?
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。