我是Spring框架的新手。我使用spring.xml
来定义数据和DataSourceTransactionManager
,以便我可以使用jdbctemplate
对象插入数据。
现在我想将rollback
添加到交易中
不幸的是,此rollback
仅适用于JdbcTemplate.updata
(字符串SQL),而不适用于JdbcTemplate.update
(PreparedStatementCreator
,Keyholder
),我曾用它来获取生成的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;
}
答案 0 :(得分:1)
应该像这样使用该代码(您需要使用作为参数给出的连接),否则使用您的代码,您将通过直接访问DataSource实例(如果是Spring)获得Spring不知道的连接我不知道它,它不知道在异常的情况下回滚):
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
PreparedStatement ps = con.prepareStatement(query,Statement.RETURN_GENERATED_KEYS);
return ps;
}