我有两个线程,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 ...
如何在没有此异常的情况下同时运行这两个线程?
答案 0 :(得分:1)
您必须使用synchronized
阻止或synchronized method
执行上述任务。
请注意,Session不是一个线程安全的对象,但是如果您确定它不会遇到并发问题,那么您需要的只是使用TransactionSynchronizationUtils
绑定一个会话到线程资源,然后在需要时取消绑定