无法让 JdbcTemplate 回滚

Posted

技术标签:

【中文标题】无法让 JdbcTemplate 回滚【英文标题】:Unable to get JdbcTemplate to Rollback 【发布时间】:2014-03-11 17:57:53 【问题描述】:

我正在使用 Spring3、Java 6 和 Oracle。我有一个服务类,实现了一个接口,它通过接口调用 DAO。

如果第二个插入失败,我希望第一个插入回滚。对于第二次插入,我只是抛出一个 RuntimeException 来测试第一次的回滚。它永远不会回滚。我在数据库中只剩下一行。

我错过了一个步骤吗?我确保使用接口,因为我读过 Spring 使用 AOP 代理来处理需要和接口的事务。

服务:

@Service
public class APIServiceImpl implements APIService 

    @Override
    @Transactional
    public void testPromotion(int duration, String productId, String offerId) 
        Integer promotionId = apidao.insertPromotion("3", productId);
        Integer test = apidao.insertTest(offerId, productId);   //runtime exception
    

道:

@Component
public class ApiDaoImpl implements ApiDao 

   public Integer insertPromotion(final int offerId, final String promoCode) 
        final String sqlText = "INSERT INTO promotion ("
                + "                promotion_id, "
                + "                offer_id, "
                + "                promotion_code, ") "
                + "             VALUES ("
                + "                seq_partner_promotion.nextval, "
                + "                ?, "
                + "                ?, ") ";


        return myJdbcTemplate.update(sqlText, offerId, promoCode);
    

    public Integer insertTest(final int offerId, final String promoCode) 
        throw new RuntimeException();
    

应用上下文:

<bean name="myJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg ref="myDataSource"/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="myDataSource"/>
</bean>

【问题讨论】:

您是否定义并应用了交易通知? 【参考方案1】:

用@Repository(而不是@Component)和@Transactional(以确保它与调用者参与相同的事务)标记ApiDaoImpl怎么样?

【讨论】:

以上是关于无法让 JdbcTemplate 回滚的主要内容,如果未能解决你的问题,请参考以下文章

Java之Spring JdbcTemplate(一篇文章精通系列)

使用 JDBCTemplate 在“IN”子句中将 List<String> 作为查询参数传递时获取 PSQL 异常

Spring对JDBC的支持

springjdbc

spring heibernate 调用存储过程

浅谈jdbcTemplate与mybatis