Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Transakcja wiosenna i wycofanie na wielu stołach

Aktualizuję moją odpowiedź:

  1. Chcesz, aby metoda „zapisywania wyceny publicznej (wycena)” była transakcyjna.
  2. kiedy ta metoda jest wywoływana ... transakcja rozpoczyna się w TransactionInterceptor i z proxy wywoływana jest „publiczna oferta zapisywania (cytat z wyceną)”
  3. Wiersz "quoteLineDao.delete(new Long(44));" działa dobrze
  4. Wiersz „System.out.println”(„°°°°°°°°°°°°°°°°°° Wiersz 44 usunięty”);” działa dobrze
  5. Wiersz "quoteDao.save(quote);" daje wyjątek naruszenia ograniczenia. Transakcja jest oznaczona jako wycofanie
  6. łapiesz ten wyjątek i zużywasz go, a nie propagujesz wyjątku
  7. metoda „public Quote save(Quote quote)” zwróci wartość null z powodu wiersza „return null;”
  8. Teraz kod dociera do przechwytywacza transakcji i ponieważ nie było wyjątku w tym przechwytywaczu, próbuje zatwierdzić, ale transakcja jest już oznaczona jako wycofanie i dlatego kończy się niepowodzeniem.

Rozwiązanie:- Nie wolno wykorzystywać wyjątku i zamiast tego propagować wyjątek ze względu na potrzeby transakcyjne.

Zmień na następujące. dodano instrukcję 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;
}

Wyjaśnienie krok po kroku jest dostępne pod tym linkiem:Nie można zatwierdzić transakcji JPA:Transakcja oznaczona jako rollbackOnly




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Brak pamięci (przydzielono 50855936) (próbowano przydzielić 50331646 bajtów)

  2. LAST_INSERT_ID() MySQL

  3. Drukowanie wyniku zapytania mysql ze zmiennej

  4. ORDER BY RAND() alternatywa

  5. Jak zrzucić tylko określone tabele z MySQL?