问题描述
这是我的问题:
我正在Java EE / Spring / Hibernate应用程序上运行批处理。该批次调用 method1
。这个方法调用一个 method2
,它可以抛出 UserException
(一个扩展 RuntimeException )。下面是它的样子:
@Transactional
公共类BatchService实现IBatchService {
@Transactional(传播= Propagation.REQUIRES_NEW)
public用户方法2(用户用户){
//处理,可以抛出RuntimeException
}
public void method1(){
// ...
尝试{
this.method2(user);
} catch(UserException e){
// ...
}
// ...
}
}
code>
在执行过程中捕获异常,但在
method1
当事务关闭时抛出RollbackException。
以下是堆栈跟踪:
org.springframework.transaction.TransactionSystemException:无法提交JPA事务;嵌套异常是javax.persistence.RollbackException:在org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:476)处标记为rollbackOnly
的事务在org.springframework.transaction.support.AbstractPlatformTransactionManager处
.processCommit(AbstractPlatformTransactionManager.java:754)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport .java:393)
在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)上的
)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $ Proxy128.method1(Unknown Source)
at batch.BatchController.method1(BatchController.java:202)
当<$ c
我尝试过: @Transactional(noRollbackFor = {UserException.class})))
on <$ c <$ c
code> method1
- 尝试并捕获
method2
ul> - 我已经将
method2
设置为public,因为如果该方法是私有的,则不会考虑注释@Transactional
如文档中所述:
blockquote
@Transactional注释可以放在接口
之前定义,接口上的方法,类定义或公共
方法。
- 我也尝试使用
Exception
而不是RuntimeException
(因为它更合适),但它也没有不会改变任何事情。
即使工作正常,问题仍然存在,因为它有一个奇怪的行为,我想知道为什么它的行为并不像它应该的那样。 解决方案
- 我也尝试使用
但它没有改变任何东西。
由于异常是在发生回滚的另一个事务中引发的,不明白为什么它不起作用。我看了一下:,但它并没有真正帮助我。
如果有人能给我一个线索,我会非常感激。
更新
我通过设置 propagation = Propagation.REQUIRES_NEW
关于由 method2
调用的方法(实际上是发送异常的方法)。此方法在类中定义,它非常类似于我的 BatchService
。所以我不明白为什么它在这个层面上工作,而不是在 method2
。