Java hibernate异常LockAcquisitionException:无法更新
在我的应用程序中,我使用Java、Hibernate(注释)和mySQL。 它在大多数情况下工作正常,但此错误偶尔会发生:Java hibernate异常LockAcquisitionException:无法更新,java,hibernate,deadlock,Java,Hibernate,Deadlock,在我的应用程序中,我使用Java、Hibernate(注释)和mySQL。 它在大多数情况下工作正常,但此错误偶尔会发生: SEVERE: Could not synchronize database state with session org.hibernate.exception.LockAcquisitionException: could not update: [myPack.Analysis$TestRun#5191] at org.hibernate.exception.
SEVERE: Could not synchronize database state with session
org.hibernate.exception.LockAcquisitionException: could not update: [myPack.Analysis$TestRun#5191]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:107)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2596)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2478)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2805)
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:114)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:260)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:180)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
at myPack.Analysis.fileHelper(Analysis.java:977)
at myPack.Analysis.dirHelper(Analysis.java:702)
at myPack.Analysis.dirHelper(Analysis.java:714)
at myPack.Analysis.dirHelper(Analysis.java:714)
at myPack.Analysis.dirHelper(Analysis.java:714)
at myPack.Analysis.dirHelper(Analysis.java:714)
at myPack.Analysis.dirHelper(Analysis.java:711)
at myPack.Analysis.parseLog(Analysis.java:682)
at myPack.Analysis.main(Analysis.java:614)
Analysis.java
中最可疑的一行是:
dbPerson = (Person) session.get(Person.class, dbPersonId, LockOptions.READ);
我所做的是使用dbPersonId
获取行,并根据需要更新/更改行内容。例如:
dbPerson.Name = "Jack";
dbPerson.Age ++;
session.saveOrUpdate(dbPerson);
我猜锁选项有问题
和
我尝试使用不同的锁定选项,如无、升级。。。但还是没有运气
最令人沮丧的是,我甚至不能手动重现这个错误。当多次调用Analysis.java时,这种情况只会偶尔发生一次
我知道会话不是线程安全的,但我不确定这是否与线程安全有关
任何想法都将不胜感激,非常感谢 由于它使用了读取
锁定选项,因此我捕获了异常,让线程休眠一段时间,然后再次尝试获取锁定,从而解决了问题:
try {
dbPerson = (Person) session.get(Person.class, dbPersonId, LockOptions.READ);
} catch (RuntimeException e) {
if (e instanceof LockAcquisitionException) {
try {
Thread.sleep(15000);
dbPerson = (Person) session.get(Person.class, dbPersonId, LockOptions.READ);
} else {
throw e;
}
我不知道如果我删除LockOptions
,它会引发什么问题,但可能一开始就没有获得锁的意义?可能是这个问题的线索?(它可能与Perl相关,而不是Java,但答案通常适用于MySQL)寻找更好的答案对于这个特定的问题我没有答案,但您应该放上“catch(LockAcquisitionException e)”,而不是检查是否存在异常,因为您是否找到了更好的答案?