我成为负责在Glassfish 4.0上运行的项目的EJB 3.1 / JPA的一部分。我是EJB的新手,因此对Session bean(和/或他们的方法)事务属性不太自信。我正在处理无状态会话bean。 我读过NOT_SUPPORTED,NEVER,SUPPORTS事务属性应谨慎使用,因为它们的行为会因应用程序服务器供应商而异。实际上,我在其他来源中找不到这样的陈述。他们真的是特定供应商吗?另外,正确的是没有注释方法或bean默认为REQUIRED事务属性吗?
还有这里的情况。让我有事务T和两个无状态bean A和B,方法为mA和mB。 mA调用mB。这些方法的事务属性有哪些可能的组合,以便事务T成功完成?我知道如果mA已经需要并且mB从未抛出异常。对于传入的事务,mB上的SUPPORTS是否适用于任何类型 - 比如确保任何事务都可以无错误地通过此方法的安全选项? 谢谢
答案 0 :(得分:0)
GlassFish 4.0是Java EE 7的参考实现,根据release notes它支持Enterprise JavaBeans 3.2(JSR-345)。
我读过NOT_SUPPORTED,NEVER,SUPPORTS事务属性应谨慎使用,因为它们的行为会因app服务器供应商而异。我找不到其他来源的警报,而不是我提到的警报。请告诉我如果我应该关注那个。
基本上 EJB规范说明要实现什么而不是如何实现因此,由于我们不是生活在一个完美的世界,因此仍然可能存在一些罕见的角落案例。我想这就是你被提醒的原因。另一方面,我不会担心这一点,因为GlassFish在全世界广泛使用,它肯定符合JSR规范。
另外,没有注释方法或bean默认为REQUIRED事务属性是否正确?
是的,这是正确的。根据EJB 3.2规范,章节 8.3.7 Bean方法的事务属性规范:
By default, the value of the transaction attribute for a method of a
bean with container-managed transaction demarcation is the REQUIRED
transaction attribute, and the transaction attribute does not need to
be explicitly specified in this case.
对于一个给定的事务,你可以在一个调用堆栈中找到我可以找到正确或不正确的不同EJB的不同方法的事务属性组合的源代码。
最终的知识来源是提到的EJB规范(第8.6章更具体),但你会发现很多有用的帖子。 通常,请仔细查看事务传播和事务划分相关主题。
SUPPORTS属性adjust method / bean是否具有任何事务属性的调用方法/ bean,以便不会发生错误?
不是真的。我会说SUPPORTS传播一个调用方法/ bean的事务上下文(如果有的话),所以你可以安全地查询其中的数据但是你应该避免改变持久化上下文的操作。