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"); 
     } 
    } 

回答

1

如果你希望你的系統,當你使用它,你可以使用樂觀鎖定的概念比少數人更執行(我知道這裏沒有涉及鎖)。

通過試圖插入新帳戶,並且如果由於重複主鍵(您需要從異常中檢查此問題)得到異常,那麼創建時就會生效,那麼您知道該帳戶已經存在創建。

因此,總之,你樂觀嘗試創建該行,如果失敗,你知道那裏已經有一個。

相關問題