EJB3.1中被无状态Bean调用的方法加@TransactionAttribute(REQUIRED_NEW)是否生效
EJB 3.1 事务属性相关问题解答
问题1:带@TransactionAttribute(REQUIRED)的无状态会话Bean调用标注@TransactionAttribute(REQUIRES_NEW)的方法是否生效
该场景的生效情况取决于调用方式:
- 通过EJB代理调用其他Bean的目标方法:注解可正常生效。容器会先挂起当前已有的REQUIRED事务,为目标方法创建独立的新事务运行,新事务的提交、回滚逻辑完全独立于被挂起的原有事务,目标方法执行完成后容器会恢复原有事务继续执行。
- 同一个无状态会话Bean的内部自调用(通过
this直接调用方法):注解不会生效。EJB的事务控制逻辑依赖容器生成的代理对象的拦截器实现,内部自调用会绕开代理层,容器无法感知到被调用方法上的事务属性配置,方法会直接沿用当前已有的事务上下文。
注意:EJB规范定义的事务属性枚举值为
REQUIRES_NEW,如果错误拼写为REQUIRED_NEW会直接导致注解不生效。
问题2:非EJB实现的普通Java类上添加@TransactionAttribute(REQUIRES_NEW)是否会被容器识别
@TransactionAttribute是EJB规范定义的专属组件注解,仅对容器托管的EJB组件生效,普通非EJB实现的Java类不属于EJB容器的管理范围,容器不会扫描、识别这类普通类上的EJB事务注解。
因此你描述的场景中,Child类对应方法上的该注解会被直接忽略,容器不会为其创建新事务,Child方法会运行在Parent无状态会话Bean调用它时的当前事务上下文中。
内容的提问来源于stack exchange,提问作者Shan
相关产品推荐
相关产品推荐

