Transactions 在javaee中调试事务

Transactions 在javaee中调试事务,transactions,jpa-2.0,java-ee-6,ejb-3.1,Transactions,Jpa 2.0,Java Ee 6,Ejb 3.1,我有一个@Stateless EJB方法,其中 从数据库中删除一些条目 使用JPAremove()的 抛出一个注释为@ApplicationException(rollback=true) 我没有该方法的其他特定于事务的注释(我设置了@TransactionAttribute(TransactionAttributeType.REQUIRED),但这应该是默认值!)。事务由容器管理。JPA提供商是EclipseLink 而且,当抛出异常时,事务不会回滚。我在回滚之前从数据库中删除的条目不会返回。

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

  • 从数据库中删除一些条目 使用JPA
    remove()
  • 抛出一个注释为
    @ApplicationException(rollback=true)
  • 我没有该方法的其他特定于事务的注释(我设置了
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    ,但这应该是默认值!)。事务由容器管理。JPA提供商是EclipseLink

    而且,当抛出异常时,事务不会回滚。我在回滚之前从数据库中删除的条目不会返回。顺便说一句,我在抛出之前调用entityManager.flush(),它会导致这样的行为吗(不应该)

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

    如何调试此问题

    我正在使用GlassFishV3和Netbeans进行调试,但我也很乐意使用println,我只是不知道把它们放在哪里

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

    只是想澄清一下你是如何得到EntityManager的

    (…)我设置@TransactionaAttribute(TransactionaAttribute.REQUIRED)

    事实上,这是默认设置,无论如何都不需要

    而且,当抛出异常时,事务不会回滚。例如,回滚之前我从数据库中删除的条目不会返回

    嗯,这很奇怪也很出乎意料

    顺便说一句,我在抛出之前调用entityManager.flush(),它会导致这样的行为吗(不应该)

    不,刷新!=提交

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

    好吧,仍然出乎意料(但至少是一致的…)

    我正在使用GlassFishV3和Netbeans进行调试

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

    • javax.enterprise.system.core.transaction
    • javax.enterprise.resource.jta
    • javax.enterprise.system.container.ejb
    作为替代方案(类似于“穷人日志”),您可以实现获取有关事务的通知

    真奇怪的问题

    另见

    除了Pascal的好答案之外,还有一些需要检查的事项……如果以下任何一项属实,您的
    EntityManager
    保证不会参与容器管理的事务:

    • 您通过EntityManager工厂创建了EntityManager
    • 您在persistence.xml中指定了
      transaction type=“RESOURCE\u LOCAL”
    要检查的次要事项:

    • 在persistence.xml中填写
    • 通过
      引用的数据源设置为参与JTA事务(自动提交关闭)

    最后两个有点特定于供应商,因为如果未指定,一些供应商将自动填写
    。如果
    指向未设置为参与JTA事务的数据源,则一些供应商将无法部署(该设置特定于供应商)。不确定Glassfish如何处理这两项。

    信息性回答,谢谢。不幸的是,问题是本地的,因为其他事务按预期工作。SessionSynchronization是我一直在寻找的,谢谢!我重新安排了代码,以便减少伤害,但我真的很好奇发生了什么……顺便说一句,记录JTA doe这没有帮助,因为将loglevel设置为NICE会产生太多额外的信息,我无法从中获得任何有用的信息。@Gabor是的,我有点担心应用程序服务器的日志记录会太冗长,这就是为什么我还提到了
    会话同步
    。你知道你的实际问题是什么吗?听起来和我的类似。