Transactions 在javaee中调试事务
我有一个@Stateless EJB方法,其中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 而且,当抛出异常时,事务不会回滚。我在回滚之前从数据库中删除的条目不会返回。
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
EntityManager
保证不会参与容器管理的事务:
- 您通过EntityManager工厂创建了EntityManager
- 您在persistence.xml中指定了
transaction type=“RESOURCE\u LOCAL”
在persistence.xml中填写- 通过
引用的数据源设置为参与JTA事务(自动提交关闭)
最后两个有点特定于供应商,因为如果未指定,一些供应商将自动填写
。如果
指向未设置为参与JTA事务的数据源,则一些供应商将无法部署(该设置特定于供应商)。不确定Glassfish如何处理这两项。信息性回答,谢谢。不幸的是,问题是本地的,因为其他事务按预期工作。SessionSynchronization是我一直在寻找的,谢谢!我重新安排了代码,以便减少伤害,但我真的很好奇发生了什么……顺便说一句,记录JTA doe这没有帮助,因为将loglevel设置为NICE会产生太多额外的信息,我无法从中获得任何有用的信息。@Gabor是的,我有点担心应用程序服务器的日志记录会太冗长,这就是为什么我还提到了会话同步
。你知道你的实际问题是什么吗?听起来和我的类似。