У меня есть один метод, который мне нужно запустить синхронизированным (если 10 пользователей вызывают этот метод, первый запускает метод, а остальные 9 ждут, когда он завершает работу, а затем второй выполняет метод и 8 оставшихся ждет ...)
Таким образом, этот метод должен сохранить один регистр в моем postgresql, но мне нужно начать и зафиксировать транзакцию внутри этого метода, поэтому поиск в Интернете я нашел это решение:
@org.springframework.transaction.annotation.Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRES_NEW)
private synchronized Registro gerarRegistro(Protocolo protocolo, List<ServicoCalculado> servicos,String especialidade, LocalDateTime dtRegistro) throws Exception{
Registro novoRegistro = new Registro();
//this method executes one method in my service that call a method in my repository with this query -> @Query(value = "SELECT MAX(numero_registro) FROM rtdpj.registro WHERE tp_especialidade = ?1", nativeQuery = true)
Long ultimoRegistro = this.registroService.findLastRegistro(especialidade);
ultimoRegistro++;
novoRegistro.setEspecialidade(especialidade);
novoRegistro.setNrPastaPj(protocolo.getPastaPJ());
novoRegistro.setNumeroRegistro(ultimoRegistro);
novoRegistro.setRegistro(registroService.gerarRegistro(ultimoRegistro, novoRegistro.getDataRegistro()));
novoRegistro.setProtocolo(protocolo.getId());
novoRegistro.setRegistroReferencia(protocolo.getRegistroReferencia());
novoRegistro.setObjetos(protocolo.getObjetos());
novoRegistro.setSituacaoAtual(protocolo.getSituacaoAtualRegistro());
novoRegistro.setObservacao(protocolo.getObservacaoRegistro());
novoRegistro.setServicos(servicos);
novoRegistro.setProtocoloCancelamentoIndisponibilidade(protocolo.getProtocoloCancelamentoIndisponibilidade());
novoRegistro.setProtocoloIndisponibilidade(protocolo.getProtocoloIndisponibilidade());
novoRegistro.setNatureza(protocolo.getNatureza());
novoRegistro.setCliente(protocolo.getCliente());
novoRegistro.setIcGuardaConservacao(protocolo.getIcGuardaConservacao());
novoRegistro.setIcPossuiSigiloLegal(protocolo.getIcPossuiSigiloLegal());
novoRegistro.setNumeroRegistroReferencia(protocolo.getNumeroRegistroReferencia());
return this.registroService.save(novoRegistro);
}
Этолучший способ сделать это?или есть лучший способ?
В моем домене свойство novoRegistro.setNumeroRegistro должно быть последовательным без ваших переходов, поэтому, если я использую SERIAL и в тот момент, когда что-то сохраняет регистр, я потерял следующее значение, и у меня естьсохранить заказ клиента при поступлении ПЕРВЫЙ к IN ПЕРВЫЙ, чтобы получить номер