我有一个@Stateless EJB方法,其中我
remove()
的@ApplicationException(rollback=true)
我没有针对该方法的其他特定于事务的注释(我设置@TransactionAttribute(TransactionAttributeType.REQUIRED)
但是这应该是默认的!)。交易是容器管理的。 JPA提供程序是EclipseLink。
但是,抛出异常时,事务不会回滚。例如。在回滚之前我从数据库中删除的条目没有返回。顺便说一句。我在抛出之前调用了entityManager.flush(),它是否会导致这种行为(它不应该)?
我也尝试拨打SessionContext.setRollbackOnly()
,结果相同。
如何调试此问题?
我正在使用Glassfish v3和Netbeans进行调试,但我对println同样感到满意,我只是不知道把它放在哪里......
答案 0 :(得分:2)
我有一个@Stateless EJB方法,其中I(...)
只是为了澄清你如何获得EntityManager?
(...)我设置@TransactionAttribute(TransactionAttributeType.REQUIRED
实际上,这是默认设置,无论如何都不应该被要求。
嗯,这是非常奇怪和意想不到的。但是,抛出异常时,事务不会回滚。例如。在回滚之前我从数据库中删除的条目没有返回。
顺便说一下。我在抛出之前调用了entityManager.flush(),它是否会导致这种行为(它不应该)?
不,冲洗!=提交
我也尝试调用SessionContext.setRollbackOnly(),结果相同。
嗯,仍然出乎意料(但至少是一致的......)。
我正在使用Glassfish v3和Netbeans进行调试
可能会激活以下类别的记录(例如,通过配置>记录>记录级别下的管理控制台)来查看是否可以发现任何奇怪的内容:
作为替代方案(有点像“穷人的记录”),您可以实施SessionSynchronization
以获得有关交易的通知。
真的很奇怪......
答案 1 :(得分:2)
除了Pascal的好答案之外,还有一些要检查的内容......如果满足以下任何条件,那么EntityManager
保证不参与容器管理的交易:
transaction-type="RESOURCE_LOCAL"
要检查的次要事项:
<jta-data-source>
填写在persistence.xml <jta-data-source>
引用的DataSource设置为参与JTA事务(自动提交已关闭)最后两个是特定于供应商的,因为如果未指定,某些供应商将自动填写<jta-data-source>
。如果<jta-data-source>
指向未设置为参与JTA事务的DataSource(该设置是特定于供应商的),则部分将失败部署。不确定Glassfish如何处理这两个项目。