Странное поведение с @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 (как это более уместно), но это также нене могу ничего изменить.

Даже если это работает, вопрос остается открытым, так как у него странное поведение, и я хотел бы понять, почему это так ».не ведет себя так, как должно быть.

Ответы на вопрос(1)

Ваш ответ на вопрос