Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Transação de mola e reversão em várias tabelas


Atualizando minha resposta:
  1. Você deseja que seu método "public Quote save(Cotação de cotação)" seja transacional.
  2. quando este método é invocado... a transação começa no TransactionInterceptor e do proxy "public Quote save(Quote quote)" é invocado
  3. Linha "quoteLineDao.delete(new Long(44));" funciona bem
  4. Linha "System.out.println("°°°°°°°°°°°°°°°°°Linha 44 excluída");" funciona bem
  5. Linha "quoteDao.save(quote);" dá exceção de violação de restrição. A transação está marcada como reversão
  6. você está pegando essa exceção e consumindo-a e não propagando a exceção
  7. método "public Quote save(quote quote) " retornará nulo devido à linha "return null;"
  8. Agora o código chega ao interceptor da transação e, como não houve exceção neste interceptor, ele tenta confirmar, mas a transação já está marcada como rollback e, portanto, falha.

Solução:- Você não deve consumir a exceção e, em vez disso, propagar a exceção devido à sua necessidade transacional.

Mude para o seguinte. adicionaram a instrução throw.
try{
      quoteLineDao.delete(new Long(44));
      System.out.println("°°°°°°°°°°°°°°°°°°Line 44 deleted");
      return  quoteDao.save(quote); 
} catch(Exception e){
      Logger.getLogger(QuoteService.class).log(Logger.Level.ERROR, e);
      throw e;
}

A explicação passo a passo está disponível neste link:Não foi possível confirmar a transação JPA:Transação marcada como rollbackOnly