0
我有多個線程Spring + Hibernate的 - 處理併發使用@Transactional方法
的要求是,以檢查是否有帳戶已經存在或以其他方式創建它,這個問題與下面的代碼同時訪問一些事務性方法的問題是如果兩個線程並行執行accountDao.findByAccountRef()方法具有相同的帳戶引用,如果他們沒有找到該帳戶,然後都嘗試創建相同的帳戶,這將是一個問題, 任何人都可以提供一些建議如何克服這一點情況?
的代碼粘貼下面
感謝 拉梅什
@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");
}
}