首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >并发执行事务时的HibernateException

并发执行事务时的HibernateException
EN

Stack Overflow用户
提问于 2020-07-20 16:55:54
回答 1查看 196关注 0票数 0

我有一个简单的方法:

代码语言:javascript
运行
复制
  public void addPerson(Person person) {

    EntityTransaction transaction = em.getTransaction();
    try {
      transaction.begin();
      em.persist(person);
      transaction.commit();
    } catch (Exception e) {
      log.error("Exception occurred: ",e);
    }
  }

当从多个线程并发调用此方法时,我将得到以下异常:

代码语言:javascript
运行
复制
Caused by: javax.persistence.PersistenceException: org.hibernate.HibernateException: Flush during cascade is dangerous
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
        at org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:65)
        ... 35 more
Caused by: org.hibernate.HibernateException: Flush during cascade is dangerous
        at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1449)
        at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:511)
        at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3290)
        at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2486)
        at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:473)
        at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:178)
        at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:39)
        at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:271)
        at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:104)
        ... 34 more

如何解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-20 17:07:30

很可能,您的两个线程共享同一个Hibernate会话。会话类的文档中清楚地提到

不是有意的,实现者才是线程安全。相反,每个线程/事务都应该从SessionFactory中获得自己的实例。

因此,对于每个线程,您需要执行如下操作:

代码语言:javascript
运行
复制
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();

然后开始并提交您的事务,最后请记住关闭会话:

代码语言:javascript
运行
复制
session.beginTransaction();
//Do something
session.getTransaction().commit();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63000296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档