在Java EE中调试事务

时间:2010-10-26 12:52:11

标签: transactions jpa-2.0 java-ee-6 ejb-3.1

我有一个@Stateless EJB方法,其中我

  1. 从数据库中删除一些条目 使用JPA remove()
  2. 抛出一个注释为@ApplicationException(rollback=true)
  3. 的异常

    我没有针对该方法的其他特定于事务的注释(我设置@TransactionAttribute(TransactionAttributeType.REQUIRED)但是这应该是默认的!)。交易是容器管理的。 JPA提供程序是EclipseLink。

    但是,抛出异常时,事务不会回滚。例如。在回滚之前我从数据库中删除的条目没有返回。顺便说一句。我在抛出之前调用了entityManager.flush(),它是否会导致这种行为(它不应该)?

    我也尝试拨打SessionContext.setRollbackOnly(),结果相同。

    如何调试此问题?

    我正在使用Glassfish v3和Netbeans进行调试,但我对println同样感到满意,我只是不知道把它放在哪里......

2 个答案:

答案 0 :(得分:2)

  

我有一个@Stateless EJB方法,其中I(...)

只是为了澄清你如何获得EntityManager?

  

(...)我设置@TransactionAttribute(TransactionAttributeType.REQUIRED

实际上,这是默认设置,无论如何都不应该被要求。

  

但是,抛出异常时,事务不会回滚。例如。在回滚之前我从数据库中删除的条目没有返回。

嗯,这是非常奇怪和意想不到的。

  

顺便说一下。我在抛出之前调用了entityManager.flush(),它是否会导致这种行为(它不应该)?

不,冲洗!=提交

  

我也尝试调用SessionContext.setRollbackOnly(),结果相同。

嗯,仍然出乎意料(但至少是一致的......)。

  

我正在使用Glassfish v3和Netbeans进行调试

可能会激活以下类别的记录(例如,通过配置>记录>记录级别下的管理控制台)来查看是否可以发现任何奇怪的内容:

  • javax.enterprise.system.core.transaction
  • javax.enterprise.resource.jta
  • javax.enterprise.system.container.ejb

作为替代方案(有点像“穷人的记录”),您可以实施SessionSynchronization以获得有关交易的通知。

真的很奇怪......

另见

答案 1 :(得分:2)

除了Pascal的好答案之外,还有一些要检查的内容......如果满足以下任何条件,那么EntityManager保证参与容器管理的交易:

  • 您通过EntityManagerFactory
  • 创建了EntityManager
  • 您在persistence.xml中指定了transaction-type="RESOURCE_LOCAL"

要检查的次要事项:

  • <jta-data-source>填写在persistence.xml
  • 通过<jta-data-source>引用的DataSource设置为参与JTA事务(自动提交已关闭)

最后两个是特定于供应商的,因为如果未指定,某些供应商将自动填写<jta-data-source>。如果<jta-data-source>指向未设置为参与JTA事务的DataSource(该设置是特定于供应商的),则部分将失败部署。不确定Glassfish如何处理这两个项目。