【问题标题】:Debugging transactions in Java EE在 Java EE 中调试事务
【发布时间】:2011-04-30 17:51:30
【问题描述】:

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

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

该方法没有其他特定于事务的注释(我设置了@TransactionAttribute(TransactionAttributeType.REQUIRED),但无论如何这应该是默认值!)。事务是容器管理的。 JPA 提供者是 EclipseLink。

而且,当异常被抛出时,事务并没有回滚。例如。我在回滚之前从数据库中删除的条目不会回来。顺便提一句。我在抛出之前调用 entityManager.flush(),它会导致这种行为(它不应该)吗?

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

如何调试这个问题?

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

【问题讨论】:

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


【解决方案1】:

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

只是为了澄清你是如何获得 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 以获取有关事务的通知。

真是奇怪的问题……

另见

【讨论】:

  • SessionSynchronization 是我一直在寻找的,谢谢!我重新排列了代码以减少伤害,但我真的很好奇发生了什么......
  • 顺便说一句,记录 JTA 并没有帮助,因为将 loglevel 设置为 NICE 会产生太多额外的信息,我无法从中获得任何有用的信息。
  • @Gabor 是的,我有点担心应用服务器日志记录会过于冗长,所以我也提到了SessionSynchronization
【解决方案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 事务的数据源(该设置是特定于供应商的),那么有些部署将失败。不确定 Glassfish 是如何处理这两个项目的。

【讨论】:

  • 内容丰富的答案,谢谢。不幸的是,问题是本地的,否则交易会按预期工作。
猜你喜欢
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 2011-10-27
  • 1970-01-01
  • 2015-07-26
  • 2016-12-27
  • 1970-01-01
相关资源
最近更新 更多