这是详细信息 -
使用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