Spring @Transational没有回滚jdbctemplate.update(PreparedStatementCreator,KeyHolder)

时间:2014-06-25 10:27:22

标签: spring rollback jdbctemplate transactional

我是Spring框架的新手。我使用spring.xml来定义数据和DataSourceTransactionManager,以便我可以使用jdbctemplate对象插入数据。
现在我想将rollback添加到交易中 不幸的是,此rollback仅适用于JdbcTemplate.updata(字符串SQL),而不适用于JdbcTemplate.updatePreparedStatementCreatorKeyholder),我曾用它来获取生成的ID insert

@Override
@Transactional("txManagerTest")
public SQLQueryObjectIF process(SQLQueryObjectIF queryObj) {

    KeyHolder keyHolder = new GeneratedKeyHolder();
    for (final String query : queryObj.getQueries()) {
        System.out.println(query);

        // Rollback works fine for the "update" below. 
        //jdbcTemplate.update(query);


        // Rollback doesn't work for the "update" below. Don't why...
        jdbcTemplate.update(new PreparedStatementCreator() {

            @Override
            public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                jdbcTemplate.getDataSource().getConnection().setAutoCommit(false);
                PreparedStatement ps = jdbcTemplate.getDataSource().getConnection().prepareStatement(query,Statement.RETURN_GENERATED_KEYS);
                return ps;
            }
        }, keyHolder);


        //log.info(keyHolder.getKeys().toString());
    }

        //just for rollback test
    if (keyHolder.toString().length()>-1){
        throw new RuntimeException("Test Error");
    }
    return queryObj;
}  

1 个答案:

答案 0 :(得分:1)

应该像这样使用该代码(您需要使用作为参数给出的连接),否则使用您的代码,您将通过直接访问DataSource实例(如果是Spring)获得Spring不知道的连接我不知道它,它不知道在异常的情况下回滚):

public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
     PreparedStatement ps = con.prepareStatement(query,Statement.RETURN_GENERATED_KEYS);
     return ps;
}