我得到了一个
org.hibernate.TransactionException: nested transactions not supported
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:152)
at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1395)
at com.mcruiseon.server.hibernate.ReadOnlyOperations.flush(ReadOnlyOperations.java:118)抛出异常的代码。我从一个运行无限的线程中调用flush,直到有数据要刷新。
public void flush(Object dataStore) throws DidNotSaveRequestSomeRandomError {
Transaction txD;
Session session;
session = currentSession();
// Below Line 118
txD = session.beginTransaction();
txD.begin() ;
session.saveOrUpdate(dataStore);
try {
txD.commit();
while(!txD.wasCommitted()) ;
} catch (ConstraintViolationException e) {
txD.rollback() ;
throw new DidNotSaveRequestSomeRandomError(dataStore, feedbackManager);
} catch (TransactionException e) {
txD.rollback() ;
} finally {
// session.flush();
txD = null;
session.close();
}
// mySession.clear();
}编辑:我在一个独立的线程中调用flush,因为datastore list包含数据。在我看来,这是一个对flush的同步操作调用,所以在理想情况下,flush应该在事务完成之前不会返回。我希望是这样,这是我最不希望看到的。因为它是一个独立的线程在做它的工作,所以我只关心它是一个同步操作。现在我的问题是,txD.commit是异步操作吗?它是否在该事务有机会完成之前返回。如果是,有没有办法让提交“等待”到事务完成?
public void run() {
Object dataStore = null;
while (true) {
try {
synchronized (flushQ) {
if (flushQ.isEmpty())
flushQ.wait();
if (flushQ.isEmpty()) {
continue;
}
dataStore = flushQ.removeFirst();
if (dataStore == null) {
continue;
}
}
try {
flush(dataStore);
} catch (DidNotSaveRequestSomeRandomError e) {
e.printStackTrace();
log.fatal(e);
}
} catch (HibernateException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}编辑2:添加了while(!txD.wasCommitted()) ; (在上面的代码中),我仍然得到了那个该死的nested transactions not supported。实际上,由于此异常,表也不会写入记录。是不是和桌子的类型有关?我所有的表都有INNODB吗?
发布于 2013-01-07 01:29:09
在调用此方法之前,您可能已经开始了一个事务。
要么这应该是封闭事务的一部分,因此您不应该启动另一个事务;要么它不应该是封闭事务的一部分,因此您应该打开一个新会话和新事务,而不是使用当前会话。
发布于 2013-01-07 14:32:59
最终修复了nested transaction not supported错误。对代码所做的更改包括
if (session.getTransaction() != null
&& session.getTransaction().isActive()) {
txD = session.getTransaction();
} else {
txD = session.beginTransaction();
}
//txD = session.beginTransaction();
// txD.begin() ;
session.saveOrUpdate(dataStore);
try {
txD.commit();
while (!txD.wasCommitted())
;
}以上代码的信用也给了Venkat。我没有找到HbTransaction,所以只使用了getTransaction和beginTransaction。啊,真灵。
由于对here的建议,我还对hibernate属性进行了更改。我将这些行添加到了hibernate.properties中。单凭这一点并不能解决问题。但我要把它留在那里。
hsqldb.write_delay_millis=0
shutdown=truehttps://stackoverflow.com/questions/14184703
复制相似问题