У меня есть сервисный метод, который в основном вставляет запись в базу данных. То, что я пытаюсь достичь, это заблокировать кусок кода на основе объекта или его переменной.
Мне нужно заблокировать другие потоки на основе этого идентификатора: rcvTransactionRequest.getPoDistributionId()
Я не хочу блокировать все потоки, которые входят в этот метод. В конце я пытаюсь проверить количество, которое не должно быть превышено, что может произойти, если несколько потоков войдут в критическую секцию.
PoDistPayload poDistPayload = poDistService.getPoDist(rcvTransactionRequest.getPoDistributionId());
synchronized (poDistPayload) {
if (!poDistService.isReceivable(poDistPayload, rcvTransactionRequest.getQuantity()))
throw ebsExceptionFactory.build(1036L, rcvTransactionRequest.getQuantity(), poDistPayload.getReceivableQuantity());
PoDistRcv poDistRcv = PoDistRcv.of(rcvTransactionRequest);
poDistRcv.setStatus(Status.TRANSACTION_STARTED);
poDistRcv = poDistRcvRepository.save(poDistRcv);
return new BaseTransactionResponse(poDistRcv.getTransactionId(), serialCountPerRequest, poDistRcv.getStatus());
}