线程和事务:不支持嵌套事务

时间:2014-04-03 12:37:33

标签: java multithreading hibernate

我有两个线程,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 ...

如何在没有此异常的情况下同时运行这两个线程?

1 个答案:

答案 0 :(得分:1)

您必须使用synchronized阻止或synchronized method执行上述任务。

请注意,Session不是一个线程安全的对象,但是如果您确定它不会遇到并发问题,那么您需要的只是使用TransactionSynchronizationUtils绑定一个会话到线程资源,然后在需要时取消绑定