2014-04-03 66 views
0

我有两个线程,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调用的另一种方法是类似的,只是它是设置B的,而不是为...

我如何得到这两个线程并发运行没有这种异常?

+0

由于您的方法创建并结束了自身内部的事务,因此每个线程都有不同的事务。它看起来像这个方法被线程调用之前那里已经有一个与该线程相关的事务。在这段代码运行之前,您可能已经在代码的某处创建了一个事务。 – Shailendra

回答

1

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

请注意,该会话不是线程安全的对象,但是如果您确定它不会遇到并发问题,您需要的仅仅是使用TransactionSynchronizationUtils将会话绑定到线程资源,然后解除绑定它在需要时

+0

你有TransactionSynchronizationUtils的例子吗?我对此并不熟悉,也没有找到太多的文档。 – l0r3nz4cc10