【问题标题】:Why does my Jboss server begin transactions for everything and anything?为什么我的 Jboss 服务器开始对所有事物进行事务处理?
【发布时间】:2015-05-24 12:35:19
【问题描述】:

我正在努力解决making sure a transaction is committed before other commands are executed.的问题

我没有得到答案,但 BalusC 表示怀疑我的... “JSF 托管 bean 是事务性的..?这不是默认行为。你们的 JSF 支持都有哪些注释bean 类?您应该基本上将事务方法分离成一个真正的服务类,然后将其注入到您的 JSF 托管 bean 中。”

我喜欢这个想法,但问题是我的任何 bean 上都没有任何与事务相关的注释。我打开com.arjuna.ats.jta 的跟踪日志记录,发现容器打开和关闭事务。到目前为止,符合预期。

但它对一切都是如此。 从服务器请求静态PNG?开始交易。通过@Schedule 运行方法?开始交易。不涉及实体管理器、数据库或任何事务。

这是预期的行为吗?

我什至在没有数据库内容的服务器上部署了一个新的测试项目,即使在那里,Arjuna 也会为每个调用开始事务。

当我创建的任何和所有 bean 已经附加了活动事务时,我应该如何将我的 db 方法分离为真正的服务 bean?

【问题讨论】:

    标签: transactions jboss7.x jta


    【解决方案1】:

    这是预期的行为吗?

    嗯,不。至少就 Java EE、JSF 和 EJB 而言不是这样。就是这样。

    但是该项目(以及我用来尝试对问题进行三角剖分的新测试项目的足够 pom 文件)是 EE6 和 Seam 3 的混蛋。而且 Seam 3 comes with a built-in, automatic transaction wrapper:

    Seam Transaction 有一个内置的 ServletRequestListener,它会为每个请求自动开始并提交(或回滚,如果事务设置为回滚)一个事务!这应该结束必须手动指定事务,或者想知道事务是否就位。

    提示

    如果需要禁用此侦听器,web.xml 中名为 org.jboss.seam.transaction.disableListener 的上下文参数设置为 true 将禁用侦听器。

    所以,在我看来,为了将我的数据库调用重构为真正的服务 bean,我有三个选择:

    • 禁用监听器
    • 从 pom 中完全删除 Seam 事务 (org.jboss.seam.transaction)
    • 升级到 EE7 /JSF 2.2 并摆脱 Seam

    编辑:

    不过,这还不是全部。 @Schedule 方法在一个用@Singleton 注释的类中,使其成为一个 EJB,并且这些 也是 默认情况下是事务性的。使用 @TransactionAttribute{SUPPORTS} 注释该特定类(即“如果有交易则使用交易,如果没有则不要打开新交易”)解决了这一问题。

    【讨论】:

      猜你喜欢
      • 2016-05-06
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多