Hibernate org.hibernate.TransactionException:jaxrs 不支持嵌套事务

2024-01-28

我将 jersey 与 mysql、hibernate 4 和 c3p0 一起使用。我创建了一个初始化 servlet,用于配置 hibernate 并将当前会话上下文类设置为线程。 我创建了 hibernateUtils 类,其中包含用于获取和提交会话的静态方法,并且我使用过滤器根据入站请求启动会话并在响应时提交它。

问题是,在某些随机间隔内,我收到 org.hibernate.TransactionException:不支持嵌套事务异常,但除了过滤器之外,我并没有尝试创建新会话。

如果我错了,请纠正我,但是当将当前会话类设置为线程时,我不需要在 hibernateutil 中创建 threadlocal,hibernate 会这样做。所以我的问题是,这是处理该问题的安全方法吗?什么可能导致随机间隔发生错误?

======================编辑============================

抱歉没有早点发布代码。 所以过滤器实现了ContainerRequestFilter,ContainerResponseFilter

在我正在做的请求过滤器中

Session session = sessionfactory.getCurrentSession();
session.getTransaction().begin();
session.setDefaultReadOnly(readOnly);

并在回应中

Transaction transaction = sessionfactory.getCurrentSession().getTransaction();
try {
    if (transaction != null && !transaction.wasCommitted()
       && !transaction.wasRolledBack() && transaction.isActive()) {
        transaction.commit();
    }
} catch (HibernateException e) {
    Transaction transaction = sessionfactory.getCurrentSession().getTransaction();
    try {
        if (transaction != null && transaction.isActive()) {
            transaction.rollback();
        }
    } catch (HibernateException e) {

    } finally {
         Session session = sessionfactory.getCurrentSession();
         try {
              if (session != null && session.isOpen()) {
                  session.close();
              }
         } catch (HibernateException e) {
            log.error("Closing session after rollback error: ", e);
            throw e;
     }

}


您似乎在过滤器中使用编程事务划分(据我所知)。因此,请仔细检查您是否正确终止每个事务,而不必介意在请求期间追加什么(即,如果出现异常则回滚,否则提交):

try {
    session.getTransaction().begin();
    // call the filter chain
    session.getTransaction().commit()
}
catch (RuntimeException e) {
    session.getTransaction().rollback();
}

如果没有代码,很难确定,但我猜想对于某些请求,您没有正确终止事务(即通过提交或回滚)。因此,事务仍然与线程关联,线程返回到线程池(处于一种非常奇怪的状态,因为仍然有一个事务与其关联),然后另一个请求重用同一线程,在过滤器中创建一个新事务...你得到了例外。

EDIT

仔细查看您的代码后,它(可能)证实了我的假设。

看流量时transaction.wasRolledBack()==true:它不会被提交或回滚。

如果你的 javadocTransaction.wasRolledBack() http://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/Transaction.html#wasRolledBack%28%29 :

这笔交易是否已回滚或设置为仅回滚?

如果事务被标记为“RollBack only”:它将返回 true,但并不意味着事务已结束。这意味着事务唯一可能的结束状态是“RollBack”。

但是,另一方面,同一个 javadoc 也这么说:

返回: boolean 如果事务通过本地事务回滚则为 True;否则为假。

我发现这很模棱两可。

所以我建议你这样做:

if (transaction != null && !transaction.wasCommitted()
   && !transaction.wasRolledBack() && transaction.isActive()) {
    transaction.commit();
}else if(transaction.wasRolledBack()){
    transaction.rollback();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate org.hibernate.TransactionException:jaxrs 不支持嵌套事务 的相关文章

随机推荐

  • 加载动态 .ini 标识符

    我正在创建我的学生计划表的虚拟版本 它基本上可以让你记下你有哪些科目的作业 Here is the interface 用户从组合框中选择主题并在相邻的备忘录中输入一些注释 完成后 他们将单击 保存 按钮 将其保存到 ini 文件中 所选日
  • 无法链接到 fftw3 库

    我正在编译一个测试程序来测试fftw3 ver3 3 4 由于它不是使用 root previlidge 安装的 所以我使用的命令是 gcc lm L home my name opt fftw 3 3 4 lib I home my na
  • 使用 selenium 检查域

    我正在尝试在 VBA 中使用 selenium 检查某些域 这是我的尝试 Option Explicit Sub Check Domain Dim bot As New WebDriver Dim sDomain As String sDo
  • JQuery 模态框和 Iframe

    我一直在使用 Simple Modal 但我觉得它不能满足我目前的需要 是否有一个模态框支持加载外部文件并允许这些外部文件关闭模态框并将父页面重定向到某个url 我想做的一个例子 您有一个用户列表 您可以单击 添加用户 然后会弹出一个带有表
  • 基于排序的分区(如快速排序)

    这是一道面试题 给定一个包含 3 种对象白色 红色 黑色的数组 应该实现数组的排序 使其看起来如下 白色 黑色 红色 面试官说 你不能使用计数排序 他的提示是考虑一些与快速排序相关的技术 所以我建议使用类似于快速排序分区的分区 他只要求只使
  • 从远程数据库检索数据

    有人可以向我解释一下从远程数据库检索数据的过程吗 我了解如何将数据从 sqlite 解析到 iPhone 应用程序 但远程数据库似乎更复杂 我尝试做研究 但是我对网络服务 云和其他我不熟悉的词感到困惑 到目前为止 我认为我需要使用 JSON
  • HDFS 对 DC/OS 中机器重启的弹性

    我已在由 10 台 Core OS 机器 3 个主节点 7 个代理节点 组成的 DCOS 集群上安装了 Universe 中的 HDFS 我的 HA HDFS 配置有 2 个名称节点 3 个日志节点和 5 个数据节点 现在 我的问题是 HD
  • R 中 visNetwork 中的边组和选择

    有没有办法创建网络边缘组 我可以选择一组显示带有节点的选定边的边吗 手动使用箭头上的不同颜色和标题进行可视化 这适用于该页面中间显示的教程等节点 https datastorm open github io visNetwork optio
  • mongodb 游标何时过期

    我对 mongodb 不了解 我只是想问是否有可能 如果可能 如何做到这一点 我的问题是我们如何知道游标何时过期 有没有用于此目的的API 如果有任何意见和建议 我将不胜感激 此致 来自 MongoDB 文档 默认情况下 当客户端用完游标中
  • 为在 WooCommerce 中显示自定义产品价格的功能启用回价后缀

    我在用 在 Woocommerce 中为登录用户启用销售价格 为未登录用户启用常规价格 https stackoverflow com questions 49706432 enable sale price for logged user
  • 尝试从类继承时出现错误:“x 实例没有属性 y”

    我无法真正理解我做错了什么 因为当我在 小规模 中尝试它并且它在那里工作时 我有一个名为Play 我是这样的 class Play def init self file open home trufa Desktop test r self
  • iOS8 和 Xcode - 如何分发具有 cocoa pod 依赖项的嵌入式框架

    我需要创建一个compiled分发给第三方的框架 我在用cocoa pods处理my依赖关系 为了实现这一目标 创建动态链接框架似乎是最好的选择 但我不确定并且愿意接受建议 我采取的步骤是 我创建了一个包装项目来包含框架目标 在包装器项目中
  • 更新查询 PHP MySQL [重复]

    这个问题在这里已经有答案了 谁能帮助我理解为什么这个更新查询没有更新我数据库中的字段 我的 php 页面中有这样的内容 用于从数据库中检索当前值
  • 自定义透明对话框(windowBackground不存在?)

    我正在尝试创建一个具有半透明背景的自定义对话框 我设法通过代码让它工作 getWindow setBackgroundDrawableResource R color bg tran 其中 bg tran A0000000 不过 我宁愿将其
  • 在 data.frame() 中移动列而不重新输入

    是否有一种方法可以将列从 data frame 中的一个位置移动到下一个位置 无需键入全新的 data frame 例如 a lt b lt c lt d lt e lt f lt g lt 1 100 df lt data frame a
  • 图像特定区域的平滑[重复]

    这个问题在这里已经有答案了 可能的重复 OpenCV中如何设置ROI https stackoverflow com questions 8206466 how to set roi in opencv 我试图在图像上使用平滑 模糊滤镜 但
  • C# 关键字作为变量

    在 VB NET 中 您可以用方括号将变量名称括起来 并使用关键字作为变量名称 如下所示 Dim goto As String 有 C 相当于这样做吗 string string
  • Django 属性错误:模块“appname”没有属性模型

    我知道我的问题可能涉及相互 循环导入 并且我在发布之前确实进行了搜索 我发现当前解决我的问题的唯一解决方案是将导入移至其中一个文件的末尾 就在实际使用导入的函数之前 但我也读到这是非常不推荐的 推荐的解决方案 只需执行以下操作 in A p
  • 在node.js中使用zlib使用字典压缩数据

    如果我想给弦放气s我可以 var d zlib deflateSync s 我注意到在类选项下的文档 https nodejs org api zlib html zlib class options我可以设置字典 但我不知道如何使用它 如
  • Hibernate org.hibernate.TransactionException:jaxrs 不支持嵌套事务

    我将 jersey 与 mysql hibernate 4 和 c3p0 一起使用 我创建了一个初始化 servlet 用于配置 hibernate 并将当前会话上下文类设置为线程 我创建了 hibernateUtils 类 其中包含用于获