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
не мешает этому.Поскольку проверка на ноль показывает как ноль, до блокировки.
Что я могу сделать?