当前位置: 首页 > 面试题库 >

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

丘飞
2023-03-14
问题内容

我正在

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)

引发该异常的代码。我正在从无限运行的线程调用刷新,直到有要刷新的数据为止。

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();
}

编辑:我正在调用独立线程中的刷新,因为数据存储列表包含数据。从我看来,它是对刷新的同步操作调用,因此理想情况下,刷新应在事务完成之前不返回。我希望这种方式是我最不希望看到的。由于它是一个独立的线程来完成其工作,因此我所关心的只是刷新操作是同步操作。现在我的问题是,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吗?


问题答案:

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

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



 类似资料:
  • [root@PPWFMD509bin]#./线程“main”java.lang.UnsupportedClassVersionError:org/apache/cassandra/cli/CliMain:Unsupported major中的cassandra cli异常。在java.lang.ClassLoader的51.0次要版本。java.lang.ClassLoader.defineCla

  • 据我所知,当您尝试在提交前一个事务之前开始一个事务时,会发生这种异常。然而,我不明白为什么在我的情况下会有这种例外。 我有一个Web应用程序与以下servlet: 这是我的Compte对象: 这是我的DAO的接口: 这就是它的实施: 另外,这是我的Spring配置: 关联的应用程序。属性文件包含以下行: 最后,我有以下servlet过滤器,从这里开始事务: 这是在网络上映射的。如下所示的xml文件

  • 问题内容: JTA为什么不支持嵌套事务?是因为实现它们的复杂性(我对此表示怀疑)还是某些设计原则? 问题答案: (正如@Piotr Nowicki指出的那样,JTA 确实 允许嵌套事务,但这不是强制性的可选操作。) 为什么?这是无法确定地回答的问题之一,除非您是做出决定时“在房间里”的人之一。 将嵌套事务作为规范的一部分包括在内可能是固有的复杂性。或当时明显的复杂性;即他们不知道他们知道如何做一个

  • 我使用Flink SQL计算基于事件时间的窗口分析。在我的数据源每天晚上空闲之前,一切都正常工作,之后直到第二天数据再次开始流动时才产生最后一分钟的结果。 我已尝试将<code>设置为table.exec.source。空闲超时,但没有帮助。我能做什么?

  • 基本上我是超级新手,开始在IT公司实习。我用Xamarin安装了VS。我面临的问题非常令人沮丧。因此,即使创建空项目,我也无法编译它,并出现如下错误: 严重性代码描述项目文件行抑制状态警告主要版本52比51更新,这是该编译器支持的最高主要版本。 我搜索了谷歌,问了这么多人,仍然没有解决我的问题。如果有人能通过skype或teamwiever帮助我,我会非常感激。我的skype: toniterda

  • 从github复制粘贴maven cucumber报告的代码后,报告不会在目标文件夹中生成。我不确定丢了什么。我试着用Runner类和MVN控制台运行,结果都没有在目标文件夹中生成报告 POM文件 和这个我的跑步者文件 我运行了