Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tại sao Hibernate ném org.hibernate.exception.LockAcquisitionException?

Theo ánh xạ của bạn, trình tự các hoạt động sẽ như sau:

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

An cập nhật hoặc một xóa nghĩa là có được khóa độc quyền , ngay cả trên READ_COMMITTED mức độ cô lập.

Nếu một giao dịch khác muốn cập nhật cùng một hàng với giao dịch đang chạy hiện tại (đã khóa hàng này được đề cập), bạn sẽ không gặp phải bế tắc mà là khóa thời gian chờ chuyển đổi ngoại lệ.

Vì bạn gặp sự cố, điều đó có nghĩa là bạn có được các ổ khóa trên nhiều bảng và việc mua lại khóa không được sắp xếp đúng thứ tự.

Vì vậy, hãy đảm bảo rằng các phương thức lớp dịch vụ thiết lập ranh giới giao dịch, không phải phương thức DAO. Tôi thấy bạn đã khai báo get tìm phương pháp sử dụng HỖ TRỢ, nghĩa là họ sẽ chỉ sử dụng một giao dịch nếu một giao dịch hiện đang được bắt đầu. Tôi nghĩ bạn cũng nên sử dụng REQUIRED cho những cái đó, nhưng chỉ cần đánh dấu chúng là read-only = true .

Vì vậy, hãy đảm bảo rằng khía cạnh giao dịch áp dụng ranh giới giao dịch trên "mymethod" chứ không phải trên 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. Có cách nào để cải thiện truy vấn MERGE không?

  2. Làm thế nào để định dạng và sắp xếp một ngày trong Oracle?

  3. tôi có thể duy trì một phiên Oracle từ hai máy khách oci không?

  4. Mật khẩu cơ sở dữ liệu đã hết hạn và các kết nối vẫn còn tồn tại

  5. Nhóm theo ID ngoại trừ các bản ghi NULL