У меня есть этот код:
@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>