假设我有一个带有以下内容的EJB注释:
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
进一步假设它注入了EntityManager
:
@PersistenceContext
private EntityManager em;
如果我在EntityManager
上执行各种操作,是否会为每个此类操作启动并提交资源本地事务?或者会有一个适合所有人?或者这种行为是否由JPA规范定义?我无法在JPA 2.0规范或EJB 3.1规范中找到合适的段落。
我知道不会为EJB方法启动 JTA 事务,但我不清楚底层EntityManager
将对哪些事务有效。我假设行为是未定义的,但我希望来自更大的StackOverflow社区的人更清楚,或者对规范的这个领域有所了解,或者对涉及该领域的讨论有所了解。
答案 0 :(得分:0)
以下是JSR 318& Sons的一些摘录。第13.6.5节可能会清除大部分问题。
13.6.2.1 NOT_SUPPORTED
容器调用其事务的企业bean方法 属性设置为NOT_SUPPORTED值,未指定 交易背景。
如果客户端使用事务上下文调用,则容器将挂起 事务上下文与当前线程的关联 在调用企业bean的业务方法之前。容器 在业务方法具有时恢复暂停的关联 完成。客户端的挂起事务上下文不是 传递给资源管理器或其他企业bean对象 从业务方法调用。
如果业务方法调用其他企业bean,则为容器 调用时不传递任何事务上下文。
13.6.5使用“未指定的事务上下文”运行的方法的处理
EJB规范没有规定容器应该如何 使用未指定的事务管理方法的执行 context - 事务语义留给容器 实现。容器如何选择的一些技术 使用未指定的事务实现方法的执行 上下文如下(该列表不包括所有可能的内容 策略):
- 容器可以执行该方法并在没有事务上下文的情况下访问底层资源管理器。
- 容器可以将实例的每个调用作为单个事务处理给资源管理器(例如,容器可以设置 JDBC连接上的自动提交选项。)
- 容器可以将实例的多个调用合并到资源管理器中。
- 容器可以将实例的多个调用合并到多个资源管理器中。
- 如果实例调用其他企业bean上的方法,并且还指定了调用的方法以未指定的方式运行 事务上下文,容器可以合并资源管理器 从多个实例调用到单个事务中。
- 上述任意组合。
如上面在规范部分13.6.2.1中所提到的,客户端与客户端之间的上下文交互。正在描述容器。
在第13.6.5节中,描述了用于处理此类事务的容器的基础机制,但这取决于实现。
答案 1 :(得分:0)
正如Nayan Wadekar所指出的,EntityManager没有关联的交易。
在您的示例中,您指定了事务范围的EntityManager(如果未另行指定,则为默认值)。这意味着需要活动事务的方法将抛出TransactionRequiredException,如persist:
[Throws] TransactionRequiredException - if invoked on a container-managed entity manager of type PersistenceContextType.TRANSACTION and there is no transaction