首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate 4.1.9 (最新最终版本)报告`不支持嵌套事务`

Hibernate 4.1.9 (最新最终版本)报告`不支持嵌套事务`
EN

Stack Overflow用户
提问于 2013-01-07 01:23:37
回答 2查看 7.6K关注 0票数 3

我得到了一个

代码语言:javascript
运行
复制
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,直到有数据要刷新。

代码语言:javascript
运行
复制
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是异步操作吗?它是否在该事务有机会完成之前返回。如果是,有没有办法让提交“等待”到事务完成?

代码语言:javascript
运行
复制
        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吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-07 01:29:09

在调用此方法之前,您可能已经开始了一个事务。

要么这应该是封闭事务的一部分,因此您不应该启动另一个事务;要么它不应该是封闭事务的一部分,因此您应该打开一个新会话和新事务,而不是使用当前会话。

票数 3
EN

Stack Overflow用户

发布于 2013-01-07 14:32:59

最终修复了nested transaction not supported错误。对代码所做的更改包括

代码语言:javascript
运行
复制
    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中。单凭这一点并不能解决问题。但我要把它留在那里。

代码语言:javascript
运行
复制
hsqldb.write_delay_millis=0
shutdown=true
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14184703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档