Bom dia, tenho um método que faz algumas validações,salva em alguns momentos usando o saveAndFlush porém tenho um problema.
Acontece que se no meio do método ali no trecho “OsbResponseDTO response” acontece alguma merda, ele não comita nada (o “atualizarTicket” é um método que deveria dar um saveAndFlush ou seja comitar) e o pool de conexão com o banco fica aberto.
O que posso fazer para que o commit seja feito independente se der problema naquele trecho ou/e o pool de conexão seja fechado?!
Melhorando a pergunta, como priorizo meus saveAndFlush antes do método que tenha a anotação @Transactional termine… ou seja, eu quero que os “saveAndFlush” sejam feitos independente se o método marcado com “Transactional” terminou sem erros
Obrigado!
@Transactional()
public Ticket efetivaVenda(VendaDTO vendaDTO) throws EntregaFlexivelException {
Loja loja = lojaRepository.findOne(vendaDTO.getCodigoLoja());
if (loja == null)
throw new EntregaFlexivelException(ErroConstants.LOJA_NAO_ENCONTRADA,
"Loja informada não cadastrada.", HttpStatus.BAD_REQUEST);
List<Ticket> tickets = ticketService.buscaTicketPorPedido(vendaDTO.getNumeroPedido());
Ticket ticket = null;
if (tickets == null || tickets.isEmpty()) {
ticket = ticketService.criaNovoTicket(vendaDTO, loja);
} else if(tickets.size() == 1) {
Ticket t = tickets.get(0);
if(t.getCdTipClsPagOpr().equals(EntregaFlexivelConstants.TIPO_OPERACAO_PAGAMENTO_VENDA)) {
return tickets.get(0);
}else {
ticket = atualizarTicket(t, vendaDTO, loja);
}
}else {
Ticket t = tickets.get(0);
if (t.getCdTipClsPagOpr().equals(EntregaFlexivelConstants.TIPO_OPERACAO_PAGAMENTO_EM_ANDAMENTO)) {
ticket = atualizarTicket(t, vendaDTO, loja);
} else if(t.getCdTipClsPagOpr().equals(EntregaFlexivelConstants.TIPO_OPERACAO_PAGAMENTO_DESISTENCIA) ||
t.getCdTipClsPagOpr().equals(EntregaFlexivelConstants.TIPO_OPERACAO_PAGAMENTO_CANCELAMENTO)) {
ticket = ticketService.criaNovoTicket(vendaDTO, loja);
} else {
return t;
}
}
ticketRepository.saveAndFlush(ticket);
try {
OsbResponseDTO response = osbService.enviaDadosOSB(ticket, vendaDTO);
ticket = OsbDadosConverter.atualizaDadosTicket(ticket, response);
ticketRepository.save(ticket);
sllService.baixaSerialSLL(ticket, EntregaFlexivelConstants.TRANSACAO_VENDA_SLL);
// atualizar a base do siv, inserindo um novo registro.
ControleCsmSiv novoTktCtrl = this.sivService.buscaTicketControlePorNumero(Long.valueOf(ticket.getNuTkt()), ticket.getLoja().getCdLoj());
if (novoTktCtrl == null) {
novoTktCtrl = this.sivService.criaNovoTicketControleSiv(ticket);
this.sivService.insereNovoTicketControleSiv(novoTktCtrl);
}
} catch(EntregaFlexivelException e) {
throw e;
}
return ticket;
}