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

标签 java multithreading hibernate asynchronous

我得到一个

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/

相关文章:

java - 如何正确构建两个类之间的 hibernate 关系

spring - 为什么LocalSessionFactoryBean 不实现getCurrentSession,同时SessionFactory 的实例可以调用该方法?

java - XPath 解析器 java 冗余

java - 我编写了计算最大公约数的代码,但存在问题

.net - Sleep(10)什么都不做?

java - 关闭除主线程之外的所有线程

C++11 线程 : Object with arguments in the constructor

java - Hibernate 急切地加载惰性引用

java - 如何使用 Jersey 将 POJO 序列化为查询参数

java - 等待异步任务的安全有效方式