這裏是我的問題:使用@Transactional(傳播= Propagation.REQUIRES_NEW)奇怪的行爲
我運行一個Java EE /春/ Hibernate應用程序的批次。該批次調用method1
。此方法調用method2
,這可能會導致UserException
(類別延伸RuntimeException
)。下面是它的樣子:
@Transactional
public class BatchService implements IBatchService {
@Transactional(propagation=Propagation.REQUIRES_NEW)
public User method2(User user) {
// Processing, which can throw a RuntimeException
}
public void method1() {
// ...
try {
this.method2(user);
} catch (UserException e) {
// ...
}
// ...
}
}
異常被逮住的繼續執行,但在method1
當交易被關閉的RollbackException結束時拋出。
這裏是堆棧跟蹤:
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:476)
at 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)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
at 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)
當method2
不拋出此異常,它工作得很好。
我曾嘗試:
- 在
method2
上method1
@Transactional(noRollbackFor={UserException.class}))
但它並沒有改變任何東西。 由於異常在不同的事務,其中回滾發生,我不明白爲什麼它不工作異常。我看過這個:Jpa transaction javax.persistence.RollbackException: Transaction marked as rollbackOnly,但它並沒有真正幫助我。
我會很感激,如果有人可以給我一個線索。
更新
我將它通過對method2
稱爲(實際上是被髮送異常的一種)的方法設置propagation=Propagation.REQUIRES_NEW
工作。這個方法在類中定義,類似於我的BatchService
。所以我不明白它爲什麼在這個級別上工作,而不是method2
。
- 我設置
method2
公衆作爲註釋@Transactional
沒有考慮到,如果如文檔中說的方法是私有的:
@Transactional註解可以在之前被放置接口 定義,接口上的方法,類定義或公共方法。
- 我還試圖用
Exception
代替RuntimeException
(因爲它是比較合適的),但它也沒有任何改變。
即使它正在工作,問題仍然存在,因爲它有一個奇怪的行爲,我想明白爲什麼它沒有像它應該那樣行事。
見http://stackoverflow.com/questions/5152686/self-injection-with-spring/可能的解決方法。 – Vadzim