事务没有使用DataSourceTransactionManager和JDBCTemplate回滚

时间:2016-12-10 10:40:52

标签: spring jdbctemplate spring-transactions spring-annotations transactionmanager

以下是详细信息 -

使用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个事务管理器 上下文,但我没有得到相同的具体答案。

1 个答案:

答案 0 :(得分:0)

公开交易方法。您可以在这篇文章中查看更多信息:Spring transactions not working + JAX WS + JDBC