Mysql
 sql >> Database >  >> RDS >> Mysql

Transazione primaverile e rollback su più tavoli

Aggiornando la mia risposta:

  1. Vuoi che il tuo metodo "Salva preventivo pubblico(Quote quote)" sia transazionale.
  2. quando viene invocato questo metodo ... la transazione inizia in TransactionInterceptor e dal proxy viene invocato "public Quote save(Quote quote)"
  3. Riga "quoteLineDao.delete(new Long(44));" funziona bene
  4. Riga "System.out.println("°°°°°°°°°°°°°°°°°°°Riga 44 eliminata");" funziona bene
  5. Riga "quoteDao.save(quote);" fornisce un'eccezione per la violazione dei vincoli. La transazione è contrassegnata come rollback
  6. stai rilevando questa eccezione e la stai consumando senza propagare l'eccezione
  7. il metodo "public Quote save(Quote quote)" restituirà null a causa della riga "return null;"
  8. Ora il codice raggiunge l'intercettore di transazione e poiché non c'erano eccezioni in questo intercettore, tenta di eseguire il commit ma la transazione è già contrassegnata come rollback e pertanto non riesce.

Soluzione:- non devi utilizzare l'eccezione e invece propagare l'eccezione a causa della tua necessità transazionale.

Passa a seguire. hanno aggiunto la dichiarazione 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;
}

La spiegazione passo passo è disponibile a questo link:Impossibile eseguire il commit della transazione JPA:transazione contrassegnata come rollbackOnly