Oracle
 sql >> база данни >  >> RDS >> Oracle

Защо Hibernate хвърля org.hibernate.exception.LockAcquisitionException?

Според вашето съпоставяне последователността от операции трябва да изглежда така:

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

Актуализация или изтриване означава придобиване на изключително заключване , дори на READ_COMMITTED ниво на изолация.

Ако друга транзакция иска да актуализира същия ред с текущата изпълнявана транзакция (която вече е заключила въпросния ред), няма да получите блокиране, а време за изчакване за придобиване на заключване изключение.

Тъй като имате блокиране, това означава, че придобивате заключвания на множество маси и придобиванията на заключвания не са правилно подредени.

Така че, уверете се, че методите на сервизния слой задават границите на транзакцията, а не методите DAO. Виждам, че си деклариралполучаването инамиране методи за използване ПОДДЪРЖАНИ, което означава, че ще използват транзакция само ако такава е стартирана в момента. Мисля, че трябва да използвате REQUIRED и за тях, но просто ги маркирайте като read-only = true .

Така че се уверете, че аспектът на транзакцията прилага границата на транзакцията към „mymethod“, а не към тези на 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. Изпълнение на Oracle Ad Hoc заявка с Bind Parameters Erroring Out; ORA-00907:липсваща дясна скоба

  2. Изберете низ като число в Oracle

  3. Как да получите индекс от различна категория, върнат по поръчка от sql в oracle?

  4. не може да получи параметър от процедурата на oracle, изпълнявана от mybatis

  5. Как да изпълнявам заданията в Oracle?