以下是详细信息 -
使用JDBCTemplate执行查询。在spring应用程序上下文文件中配置所需的类如下 -
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="mydataSource" />
</bean>
<bean id="jdbcTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="mydataSource" />
<qualifier value="jdbcTransactionManager"/>
</bean>
<tx:annotation-driven transaction-manager="jdbcTransactionManager"/>
<bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf">
<property name="transactionManager" ref="datamigrationTransactionManager" />
</bean>
请注意,在同一配置文件中,HibernateTemplate还配置了相应的事务管理器声明,如下所示 -
<bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="dataSource" ref="mydataSource" />
<property name="sessionFactory" ref="refSessionFactory" />
<qualifier value="hibernateTransactionManager"/>
</bean>
<tx:annotation-driven transaction-manager="hibernateTransactionManager"/>
<bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf">
<property name="transactionManager" ref="hibernateTransactionManager" />
</bean>
我在服务类中使用@Transactional
注释,并且正确指定了在spring配置文件中声明的jdbc事务管理器的名称,其中我在方法中执行3个语句,注释如下 -
@Transactional(value = "jdbcTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = java.lang.Exception.class)
以及按以下顺序执行的语句 - (1)对表1执行插入查询 (2)对表2执行插入查询 (3)使用事务注释对表3方法执行更新查询,如下所示 -
@Transactional(value = "jdbcTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = java.lang.Exception.class)
private boolean executeDBOperations(List<Integer> listIdData, List<String> listStringIds, int index) throws Exception
{
List<Integer> idsInBatch = jdbcDAO.getIdsInBatch(index);
jdbcDAO.fetchAndInsertMainTableRecords(listIdData);
jdbcDAO.fetchAndInsertAssociatedTableRecords(listStringIds);
jdbcDAO.updateAssociatedTable2Values(idsInBatch);
jdbcDAO.deleteSourceRecords(index);
return true;
}
更新查询时 - &gt;来自上面方法的jdbcDAO.updateAssociatedTable2Values(idsInBatch);
失败,理想情况下应该回滚在前2次调用期间插入的记录。但它没有发生。当然,由于更新操作失败,删除操作不会执行。另请注意与更新查询引发的数据相关的异常。它只是数据问题的原因,更新没有发生,我已经引入了该错误来验证方法的提交和回滚行为。
现在根据实现和规范,如果任何db操作/调用失败,则以相同的方法执行其余操作 应该回滚。但它不起作用。我正在使用Oracle DB。
我在与使用JDBCTemplate的事务相关的SO上检查了几个问题,并在同一个spring应用程序中使用了2个事务管理器 上下文,但我没有得到相同的具体答案。