我正在努力解决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?
答案 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,我有三个选择:
org.jboss.seam.transaction
)修改强>
但是,这不是整件事。@Schedule
方法在使用@Singleton
注释的类中,使其成为EJB,并且那些也默认为事务性。使用@TransactionAttribute{SUPPORTS}
注释该特定类(即“如果有事务则使用事务但如果没有事务则不使用新事务”)负责处理。