【问题标题】:Threads and transactions : nested transactions not supported线程和事务:不支持嵌套事务
【发布时间】:2014-04-03 12:37:32
【问题描述】:

我有两个线程,A 和 B,每个线程都将数据插入到两个不同且不相关的表中。 但是我收到了org.hibernate.TransactionException: nested transactions not supported

这是线程 A 的插入代码:

    @Override
    public void setA(List<A> a) throws HibernateException {

        if (session == null) {
            session = sessionFactory.openSession();
        }
        Transaction tx = session.beginTransaction();
        try {
            int count = 0;
            for (A row : a) {
                session.save(row);

                if (count++ % 1000 == 0) {
                    session.flush();
                    session.clear();
                }
            }
            tx.commit();
        } catch (Exception e) {
                tx.rollback();
        } finally {
            session.close();
        }
    }

线程B调用的其他方法类似,只是设置了Bs而不是As...

如何让这 2 个线程同时运行而不会出现此异常?

【问题讨论】:

  • 由于您的方法在自身内部创建和结束事务,因此每个线程将具有不同的事务。看起来在线程调用此方法之前,已经有一个与该线程关联的事务。在这段代码运行之前,您可能已经在代码中的某处创建了事务。

标签: java multithreading hibernate


【解决方案1】:

您必须使用synchronized 块或synchronized method 来执行上述任务。

注意,Session 不是线程安全的对象,但如果你确定它不会有并发问题,你只需要使用TransactionSynchronizationUtils 将会话绑定到线程资源,然后需要时解除绑定

【讨论】:

  • 你有 TransactionSynchronizationUtils 的例子吗?我对此并不熟悉,也没有找到太多文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多