我使用的是Spring 3.2.2版本,
当我使用@Transactional和jdbc模板
时,我遇到了问题我的XML配置如下:
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory" />
<bean id="reportTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="reportDataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" order="0"/>
<tx:annotation-driven transaction-manager="reportTransactionManager" order="1"/>
代码:
@Transactional(value = "reportTransactionManager", rollbackFor = Exception.class)
public ReportResponse deleteAndSave(input) throws ReportServiceException {
service1.saveData(input);
service2.saveData(input);
service3.saveData(input);
service4.saveData(input);
service5.saveData(input);
service6.saveData(input);
service7.saveData(input);
} catch (Exception exception) {
_LOGGER.debug("Caught exception all KPI changes should be reverted back for scenario id {}", scenarioId);
_LOGGER.error(ExceptionUtils.getFullStackTrace(exception));
throw new ReportServiceException(exception.getMessage(), exception);
}
return reportResponse;
}
所以问题是任何服务失败都应该回滚,但在我的情况下,如果假设service7失败,除了一个服务,只有service4之外,所有服务都被回滚,
我认为可能是事务没有传播到service4 api,然后我测试了 TransactionSynchronizationManager.getCurrentTransactionName();
TransactionSynchronizationManager.isSynchronizationActive();
TransactionSynchronizationManager.isCurrentTransactionReadOnly();
TransactionSynchronizationManager.isActualTransactionActive();
它正确地返回了我的事务及其详细信息,但仍然没有回滚
我很惊讶为什么只有那个服务api无法回滚,任何人都可以就此建议我。
注意:除了root方法中的deleteAndSave api之外,没有任何其他服务/存储库类没有任何@transaction becoz默认情况下spring将传播。 我没有任何问题与hibernate transactionManager bcoz这些服务只涉及reportTransactionManager管理器。