Откат транзакции не работает, используя распространение = Propagation.SUPPORTS в вызываемом методе - PullRequest
0 голосов
/ 23 октября 2018

У меня есть этот код:

@Service
public class ServiceA {

  @Autowired
  private SomeDao someDao;

  @Autowired
  private SomeService someService;

  @Transactional
  public void methodA() {
    someDao.saveEntity(entity);
    // inside saveEntity():
    //     Session sess = getCurrentSession();
    //     Long id = (Long) sess.save(entity);
    //     sess.flush();
    //     sess.clear();
    someService.getToken();
    // "getToken()" annotated with
    // @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    throw new RuntimeException("some exception!");
  }

Когда я вызываю "methodA ()", в журнале появляется сообщение о том, что транзакция была откатана:

TransactionInterceptor        - Completing transaction for [...methodA] after exception: java.lang.RuntimeException: some exception!
RuleBasedTransactionAttribute - Applying rules to determine whether transaction should rollback on java.lang.RuntimeException: some exception!
RuleBasedTransactionAttribute - Winning rollback rule is: RollbackRuleAttribute with pattern [java.lang.Exception]
HibernateTransactionManager   - Triggering beforeCompletion synchronization
HibernateTransactionManager   - Initiating transaction rollback
HibernateTransactionManager   - Rolling back Hibernate transaction on Session [SessionImpl(...)]

Но на самом деле транзакцияне откатывается, и запись появляется в базе данных.

Если я изменю аннотацию метода "someService.getToken ()" на "@Transactional (распространение = Propagation.REQUIRES_NEW)", журнал почтиТо же самое (за исключением того факта, что внешняя транзакция приостановлена, а новая создана для метода "someService.getToken ()" и зафиксирована после ее завершения), но транзакция действительно откатывается

база данных:oracle 11g

версии зависимостей:

<org.springframework-version>4.2.5.RELEASE</org.springframework-version>
<hibernate.version>4.3.11.Final</hibernate.version>

Менеджер транзакций:

<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager"
      class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...