【发布时间】:2014-06-25 10:27:21
【问题描述】:
我是 Spring 框架的新手。我用spring.xml定义了datasouce和DataSourceTransactionManager,这样我就可以用jdbctemplate对象插入数据了。
现在我想将rollback 添加到交易中。
不幸的是,这个rollback 仅适用于JdbcTemplate.updata(String SQL),不适用于JdbcTemplate.update(PreparedStatementCreator,Keyholder),我曾经通过insert 获取生成的ID。
@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;
}
【问题讨论】:
标签: spring rollback jdbctemplate transactional