交易不会使用DataSourCetransactionManager和JDBCTEMPLATE回滚



这是详细信息 -

使用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 Config File中声明的JDBC Transaction Manager的名称正确指定了我正在执行3个语句的方法,如下所示 -

@Transactional(value = "jdbcTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = java.lang.Exception.class)

和按照序列执行的语句 - (1)执行表1的插入查询(2)执行表2的插入查询(3)使用Transactional注释执行表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;
    }

当更新查询 -> jdbcDAO.updateAssociatedTable2Values(idsInBatch);从上述方法失败时,理想情况下,在前2个呼叫期间插入的记录应回滚。但是它没有发生。当然,由于更新操作失败,因此删除操作不会执行。另外,请注意与为"更新查询"抛出的数据相关的例外。只是数据问题的原因没有发生,我引入了该错误来验证该方法的提交和回滚行为。

现在根据实施和规格,如果任何数据库操作/呼叫失败,则以相同方法执行的其余操作应该回头。但是它不起作用。我正在使用Oracle DB。

我检查了一些与JDBCtemplate交易相关的问题,并在同一春季应用程序中使用了2个交易经理上下文,但我没有得到相同的具体答案。

公开交易方法。您可以查看此帖子,那里有更多信息:春季交易不起作用 JAX WS JDBC

相关内容

  • 没有找到相关文章

最新更新