在默认的JEE容器管理环境中,只有企业bean(通常为@Stateless
beans被使用)是事务性的。一旦你从外面输入这样一个bean,交易将被打开。通过@javax.transaction.Transactional
注释,您可以控制事务的行为,但在默认情况下这不是必需的。
例豆:
@Stateless
public MyBean {
public void withinTransaction() {
System.out.println("i'm running within a transaction");
}
@Transactional(TxType.NOT_SUPPORTED)
public void outsideTransaction() {
System.out.println("no transaction available...");
}
}
- 如果调用从Servlet
MyBean.withinTransaction
(例如,经由REST),一个新的事务被创建(如果尚未存在)。
- 如果您致电
MyBean.outsideTransaction
,则不会创建任何交易。
- 如果你调用从
withinTransaction
this.outsideTransaction()
,你仍然有可交易的outsideTransaction
(因为拦截器只绑定到bean边界)
- 如果从
outsideTransaction
调用this.withinTransaction()
没有新的交易产生(因为拦截器只有绑定到豆边界)
- 如果
outsideTransaction
将是第二个bean AnotherBean
,这@Inject
小号MyBean
的一部分,你叫MyBean.withinTransaction
,然后一个新的事务将被创建(如果尚未存在)。因为你跨越了AnotherBean.outsideTransaction
和MyBean.withinTransaction
之间的bean边界。
我觉得自己没有足够的细节这个问题得到比如何建立与数据库连接的应用程序完全JEE教程更好的答案。这超出了StackOverflow范围。你可以缩小你的问题吗?比如你问“有没有配置丢失”,而没有提及你实际拥有的配置。或者粘贴任何可以告诉我们的代码,如果你正在做你说的正确的事情。 – Deltharis
您是否做过任何会禁用自动交易的功能? –
我们需要知道你在哪里放置@Transactional注释。请分享您的代码。你不需要任何拦截器,因为'@Transactional'已经是拦截器绑定了。 – Rouliboy