【问题标题】:hibernate exception LockAcquisitionException: could not update休眠异常 LockAcquisitionException:无法更新
【发布时间】:2012-10-09 20:26:08
【问题描述】:

在我的应用程序中,我使用的是 Java、Hibernate(Annotations) 和 mySQL。 它大部分时间都运行良好,但偶尔会发生此错误:

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

我猜LockOptions 和 我尝试使用不同的锁定选项,例如 NONE, UPGRADE... 但仍然没有运气。

最令人沮丧的是我什至无法手动重现此错误。只有在多次调用 Analysis.java 时才会发生一次。

我知道会话不是线程安全的,但我不确定这是否与此有关。

任何想法将不胜感激,非常感谢!

【问题讨论】:

  • 我不知道如果我删除LockOptions 会引发什么问题,但也许一开始就没有必要锁定?
  • 也许这个问题的线索? stackoverflow.com/questions/2596005/…(可能与 Perl 相关而不是 Java,但答案一般适用于 MySQL)

标签: java hibernate deadlock


【解决方案1】:

由于它使用READ锁选项,我捕获了异常,让线程休眠一段时间,然后再次尝试获取锁,这样就解决了问题:

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

【讨论】:

  • 寻找更好的答案
  • 这个具体问题我没有答案,但你应该输入 'catch (LockAcquisitionException e)' 而不是检查异常是否存在
  • 你找到更好的答案了吗?
猜你喜欢
  • 1970-01-01
  • 2019-07-12
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 2013-12-24
  • 1970-01-01
相关资源
最近更新 更多