Spring + Hibernate - 使用@Transactional 方法处理并发
Spring + Hibernate - handling concurrency with @Transactional method
我遇到了多个线程同时访问某些事务方法的问题
要求是检查一个帐户是否已经存在或以其他方式创建它,下面代码的问题是如果两个线程并行执行具有相同帐户引用的 accountDao.findByAccountRef() 方法并且他们没有发现account ,然后两者都尝试创建相同的帐户,这将是一个问题,
谁能给我一些如何克服这种情况的建议?
代码贴在下面
谢谢
拉梅什
@Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED)
@Override
public void createAccount(final String accountRef, final Money amount) {
LOG.debug("creating account with reference {}", accountRef);
if (isNotBlank(accountRef)) {
// only create a new Account if it doesn't exist already for the given reference
Optional<AccountEO> accountOptional = accountDao.findByAccountRef(accountRef);
if (accountOptional.isPresent()) {
throw new AccountException("Account already exists for the given reference %s", accountRef);
}
// no such account exists, so create one now
accountDao.create(newAccount(accountRef, neverNull(amount)));
} else {
throw new AccountException("account reference cannot be empty");
}
}
如果你想让你的系统在有超过少数人使用它时执行,你可以使用乐观锁的概念(我知道这里不涉及锁)。
在创建时通过尝试插入新帐户来工作,如果由于主键重复而出现异常(您需要从异常中检查),那么您就知道该帐户是已经创建。
简而言之,您乐观地 尝试创建该行,如果失败,您知道已经有一个了。
我遇到了多个线程同时访问某些事务方法的问题
要求是检查一个帐户是否已经存在或以其他方式创建它,下面代码的问题是如果两个线程并行执行具有相同帐户引用的 accountDao.findByAccountRef() 方法并且他们没有发现account ,然后两者都尝试创建相同的帐户,这将是一个问题, 谁能给我一些如何克服这种情况的建议?
代码贴在下面
谢谢 拉梅什
@Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED)
@Override
public void createAccount(final String accountRef, final Money amount) {
LOG.debug("creating account with reference {}", accountRef);
if (isNotBlank(accountRef)) {
// only create a new Account if it doesn't exist already for the given reference
Optional<AccountEO> accountOptional = accountDao.findByAccountRef(accountRef);
if (accountOptional.isPresent()) {
throw new AccountException("Account already exists for the given reference %s", accountRef);
}
// no such account exists, so create one now
accountDao.create(newAccount(accountRef, neverNull(amount)));
} else {
throw new AccountException("account reference cannot be empty");
}
}
如果你想让你的系统在有超过少数人使用它时执行,你可以使用乐观锁的概念(我知道这里不涉及锁)。
在创建时通过尝试插入新帐户来工作,如果由于主键重复而出现异常(您需要从异常中检查),那么您就知道该帐户是已经创建。
简而言之,您乐观地 尝试创建该行,如果失败,您知道已经有一个了。