Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dlaczego Hibernate zgłasza org.hibernate.exception.LockAcquisitionException?

Zgodnie z Twoim mapowaniem sekwencja operacji powinna wyglądać tak:

Person p = DAO.findPerson(id);

Car car = new Car();
car.setPerson(p);

DAO.saveOrUpdate(car);

p.getCars().add(car);

Car firstCar = p.getCars().get(0);
firstCar.setPerson(null);
p.getCars().remove(firstCar);
if (p.officialCar.equals(firstCar)) {
   p.officialCar = null;
   p.officialCar.person = null;
}

DAO.delete(firstCar);

aktualizacja lub usuń oznacza nabycie wyłącznej blokady , nawet na READ_COMMITTED poziom izolacji.

Jeśli inna transakcja chce zaktualizować ten sam wiersz z bieżącą transakcją (która już zablokowała ten wiersz), nie dostaniesz zakleszczenia, ale limit czasu akwizycji blokady wyjątek.

Ponieważ masz zakleszczenie, oznacza to, że uzyskujesz blokady na wielu tabelach, a przejęcia blokad nie są odpowiednio uporządkowane.

Upewnij się więc, że to metody warstwy usług wyznaczają granice transakcji, a nie metody DAO. Widzę, że zadeklarowałeś dostać i znajdź metody do użycia SUPPORTED, co oznacza, że ​​będą używać transakcji tylko wtedy, gdy jest ona aktualnie uruchomiona. Myślę, że powinieneś użyć REQUIRED również dla nich, ale po prostu oznacz je jako read-only = true .

Upewnij się więc, że aspekt transakcji stosuje granicę transakcji w „mojej metodzie”, a nie w metodach DAO.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pobieranie długich surowych danych do zmiennej clob

  2. Jak sformatować kolumnę NUMBER w Oracle?

  3. Jak przeprowadzić migrację bazy danych Oracle z AWS EC2 do AWS RDS

  4. Pierwsze kroki z Oracle Application Express-APEX

  5. NEW_TIME() Funkcja w Oracle