为什么我的Jboss服务器会为所有内容开始交易?

时间:2015-05-24 12:35:19

标签: transactions jboss7.x jta

我正在努力解决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?

1 个答案:

答案 0 :(得分:0)

  

这是预期的行为吗?

嗯,不。至少就Java EE,JSF和EJB而言并非如此。就是这样。

但是这个项目(以及我过去常常尝试对问题进行三角测量的新测试项目的pom文件)是EE6和Seam 3的混蛋。 Seam 3 comes with a built-in, automatic transaction wrapper: < / p>

  

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

     

提示

     

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

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

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

修改

但是,这不是整件事。 @Schedule方法在使用@Singleton注释的类中,使其成为EJB,并且那些默认为事务性。使用@TransactionAttribute{SUPPORTS}注释该特定类(即“如果有事务则使用事务但如果没有事务则不使用新事务”)负责处理。