Оптимистическая блокировка не удалась при попытке сохранить ту же строку - PullRequest
0 голосов
/ 05 декабря 2018
public Long upsertCreditRiskInformation(@Valid CreditRiskInformationCodeTermBasedRequest request, Boolean codeBased)
            throws IOException {
      `CreditRisk creditRisk =` creditRiskDataRepository.findByOrganisationId(organisation.getId());

        if (creditRisk == null) {

            if (codeBased) {

                creditRisk =
                        new CreditRisk(null, creditRiskData, null, getExternalQueryDate(creditRiskData), organisation);
            } else {
                creditRisk =
                        new CreditRisk(creditRiskData, null, getExternalQueryDate(creditRiskData), null, organisation);
            }

        } else {// modify

            creditRisk.modifyCreditRisk(creditRisk, request.getCreditRiskData(), getExternalQueryDate(creditRiskData),
                    codeBased);
        }

        return creditRiskDataRepository.save(creditRisk).getId();
    }
}

- это метод, который вызывается из двух мест одновременно.

Один отправляет с codebased=true, другой с false.Так что, если это новое создание, оба могут попытаться создать новое.

Как я могу предотвратить это?

Я использовал @Transactional(isolation = Isolation.READ_COMMITTED)

начало метода.Но на этот раз ошибка:

    ould not execute statement; SQL [n/a]; constraint [UK_jvmwr3y956lfnbk4fhh859cof]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement (Duplicate entry '13' for key 'UK_jvmwr3y956lfnbk4fhh859cof')
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [UK_jvmwr3y956lfnbk4fhh859cof]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

Не могу понять, где ошибка.Он сигнализирует о последней строке, repository.save

Поскольку я делаю null check раньше, поэтому lock не мешает этому.Поскольку проверка на ноль показывает как ноль, до блокировки.

Что я могу сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...