gpt4 book ai didi

java - Hibernate 4.1.9(最新的最终版本)报告 `nested transactions not supported`

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:40:36 24 4
gpt4 key购买 nike

我得到一个

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,因为数据存储列表包含数据。据我所知,它是对刷新的同步操作调用,因此理想情况下刷新在事务完成之前不应返回。我希望那样是我最不希望看到的。由于它是一个独立的线程来完成它的工作,所以我只关心它刷新是一个同步操作。现在我的问题是,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()) ;(在上面的代码中),但我仍然得到了那个奇怪的不支持嵌套事务。事实上,由于这个异常,表也没有写入记录。与表的类型有关吗?我的所有表都有 INNODB 吗?

最佳答案

终于修复了 不支持嵌套事务 错误。对代码所做的更改是

    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=true

关于java - Hibernate 4.1.9(最新的最终版本)报告 `nested transactions not supported`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14184703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com