Hibernate抛出org.hibernate.exception.LockAcquisitionException
我有这个方法:
mymethod(long id){ Person p = DAO.findPerson(id); Car car = new Car(); car.setPerson(p); p.getCars().add(car); DAO.saveOrUpdate(car); DAO.saveOrUpdate(p); DAO.delete(p.getCars().get(0));//A person have many cars }
映射:
Person.hbm.xml
Cars.hbm.xml
这种方法适用于单个线程,并且在多个线程上,给出了一个错误:
02/08/2014 - 5:19:11 pm - [pool-1-thread-35] - WARN - org.hibernate.util.JDBCExceptionReporter - SQL Error: 60, SQLState: 61000 02/08/2014 - 5:19:11 pm - [pool-1-thread-35] - ERROR - org.hibernate.util.JDBCExceptionReporter - ORA-00060: deadlock detection while waiting for a resource 02/08/2014 - 5:19:11 pm - [pool-1-thread-35] - WARN - org.hibernate.util.JDBCExceptionReporter - SQL Error: 60, SQLState: 61000 02/08/2014 - 5:19:11 pm - [pool-1-thread-35] - ERROR - org.hibernate.util.JDBCExceptionReporter - ORA-00060: deadlock detection while waiting for a resource 02/08/2014 - 5:19:11 pm - [pool-1-thread-35] - ERROR - org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session org.hibernate.exception.LockAcquisitionException: Could not execute JDBC batch update
AOP交易:
注意:当我在更新后添加Thread.sleep(5000)时,它没问题。 但这个解决方案并不干净。
首先,让我们设置以下Hibernate属性:
hibernate.order_updates=true hibernate.order_inserts=true
其次,根据您的映射,操作顺序应如下所示:
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隔离级别上也是如此。 如果另一个事务想要使用当前正在运行的事务更新同一行(已经锁定了该行),则不会出现死锁,而是锁定获取超时exception。
由于您遇到了死锁,这意味着您获取了多个表上的锁,并且锁定采集未正确排序。
因此,请确保您的服务是事务边界,而不是DAO方法。 我看到你声明了get和find方法使用SUPPORTED,这意味着只有在当前启动时才会使用事务。 我认为你也应该使用REQUIRED,但只需将它们标记为readonly = true
。
因此,请确保事务方面在“mymethod”上应用事务边界而不在DAO上应用事务边界。
我有汽车 – >(1-n)个地方。 我在表格中有一个外键(id_car)。 这个外键没有索引。 当我向这个外键添加索引时,我的问题得到了解决。
请参阅本答复
- Hibernate:无法初始化代理 – 没有Session(通过引用链……)
- 生成的序列以1而不是1000开始,在注释中设置
- 为什么hibernate执行两个查询以急切加载@OneToOne双向关联?
- java.lang.NoClassDefFoundError:org / hibernate / cache / EntityRegion配置EHCache
- Jersey,Guice和Hibernate – EntityManager线程安全
- Spring Data JPA:嵌套实体的批量插入
- 注入自动连接的依赖项失败; 嵌套exception是org.springframework.beans.factory.BeanCreationException:
- 如何在dropwizard上使用guice自动连接HibernateBundle?
- hibernate如何从现有数据库视图中检索数据?