Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Spring-Transaktion und Rollback für mehrere Tabellen

Aktualisieren meiner Antwort:

  1. Sie möchten, dass Ihre Methode "öffentliches Angebot speichern (Angebotsangebot)" transaktional ist.
  2. wenn diese Methode aufgerufen wird ... beginnt die Transaktion im TransactionInterceptor und vom Proxy wird "public Quote save(Quote quote)" aufgerufen
  3. Zeile "quoteLineDao.delete(new Long(44));" funktioniert gut
  4. Zeile "System.out.println("°°°°°°°°°°°°°°°°°°°Zeile 44 gelöscht");" funktioniert gut
  5. Zeile "quoteDao.save(quote);" gibt eine Einschränkungsverletzungsausnahme. Transaktion wird als Rollback markiert
  6. Sie fangen diese Ausnahme ab und verwenden sie und geben die Ausnahme nicht weiter
  7. Methode "public Quote save(Quote quote) " gibt wegen der Zeile "return null;" null zurück
  8. Jetzt erreicht der Code den Transaktions-Interceptor und da es bei diesem Interceptor keine Ausnahme gab, versucht er zu committen, aber die Transaktion ist bereits als Rollback markiert und schlägt daher fehl.

Lösung:- Sie dürfen die Ausnahme nicht verbrauchen und stattdessen die Ausnahme aufgrund Ihrer Transaktionsanforderungen weitergeben.

Wechseln Sie zu Folgendem. habe Throw-Anweisung hinzugefügt.

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;
}

Eine schrittweise Erklärung finden Sie unter diesem Link:JPA-Transaktion konnte nicht festgeschrieben werden:Transaktion als rollbackOnly markiert