Странное поведение с @Transactional (распространение = распространение. REQUIRES_NEW)
Вот моя проблема: я
запускаю пакет в приложении Java EE / Spring / 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
не выбрасывает это исключение, оно работает хорошо.
Что я пробовал:
настройка@Transactional(noRollbackFor={UserException.class}))
наmethod1
Попробуй пойматьmethod2
Но это нене могу ничего изменить.
Поскольку исключение выдается в другой транзакции, где произошел откат, я нене понимаю, почему это не такт работа. Я посмотрел на это:Jpa-транзакция javax.persistence.RollbackException: транзакция, помеченная как rollbackOnly но это неэто действительно помогает мне
Я буду очень признателен, если кто-нибудь сможет дать мне подсказку.
UpdateI»
мы сделали это, установивpropagation=Propagation.REQUIRES_NEW
на метод, вызванныйmethod2
(который на самом деле тот, который отправляет исключение). Этот метод определен в классе, очень похожем на мойBatchService
, Так что я нене понимаю, почему это работает на этом уровне, а не на. Я 'method2
method2
так же публично, как аннотация@Transactional
не учитывается, если метод является закрытым, как указано в документации:Аннотация @Transactional может быть помещена перед определением интерфейса, методом на интерфейсе, определением класса или открытым методом на классе.
Я также пытался использоватьException
вместоRuntimeException
(как это более уместно), но это также нене могу ничего изменить.Даже если это работает, вопрос остается открытым, так как у него странное поведение, и я хотел бы понять, почему это так ».не ведет себя так, как должно быть.