sql >> Database >  >> RDS >> Mysql

Springtransactie en terugdraaien op meerdere tafels

Mijn antwoord bijwerken:

  1. U wilt dat uw "public Quote save (Quote quote)"-methode transactief is.
  2. wanneer deze methode wordt aangeroepen ... begint de transactie in de TransactionInterceptor en vanaf de proxy wordt "public Quote save(Quote quote)" aangeroepen
  3. Regel "quoteLineDao.delete(new Long(44));" werkt prima
  4. Line "System.out.println("°°°°°°°°°°°°°°°°°°°Line 44 verwijderd");" werkt prima
  5. Regel "quoteDao.save(quote);" geeft beperking overtreding uitzondering. Transactie is gemarkeerd als terugdraaien
  6. je vangt deze uitzondering en consumeert deze en verspreidt de uitzondering niet
  7. methode "public Quote save(Quote quote)" retourneert null vanwege de regel "return null;"
  8. Nu bereikt de code de transactie-interceptor en aangezien er geen uitzondering was bij deze interceptor, probeert deze vast te leggen, maar de transactie is al gemarkeerd als terugdraaien en mislukt daarom.

Oplossing:- U moet de uitzondering niet gebruiken en in plaats daarvan de uitzondering verspreiden vanwege uw transactiebehoefte.

Wijzig naar volgen. hebben een throw-statement toegevoegd.

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

Stap voor stap uitleg is beschikbaar in deze link:Kon JPA-transactie niet uitvoeren:transactie gemarkeerd als rollbackOnly




  1. Replicatie tussen SQL Server en MYSQL

  2. Gegevens groeperen met de functies OVER en PARTITION BY

  3. Wat te controleren in MySQL 8.0

  4. Hoe een datum in Duits formaat weer te geven in SQL Server (T-SQL)