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

Если вы хотите, чтобы ваша система для выполнения, когда у вас есть больше, чем горстка людей, использующих его, вы можете использовать концепцию оптимистической блокировки (Я знаю, что здесь нет блокировки).

При создании это работает, пытаясь вставить новую учетную запись, и если вы получаете исключение из-за дублирующего первичного ключа (вам нужно проверить это из исключения), то вы знаете, что учетная запись уже была создано.

Итак, вы оптимистично попытайтесь создать строку, и если она не удалась, вы знаете, что там уже есть.

Смежные вопросы