我使用Spring Framework进行数据库调用。 我有一个更新,涉及调用2个存储过程,每个过程都执行多个操作。
我在每个SP中分别定义了事务管理,如下所示:
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
END;
START TRANSACTION;
.......logic .........
COMMIT;
如果我自己调用每个SP,这可以正常工作,但是我想在一个事务中进行整个操作,所以如果对第一个SP的调用有效,但是对第二个SP的调用失败,它会回滚两个。
所以显然我需要从sps中删除提交并在Spring端处理它。
目前对于Spring我使用SimpleJDBCCall(下面的代码提取)
public List executeSP(String spName, Map<String,Object> params, RowMapper mapper) throws Exception {
try {
SimpleJdbcCall template = new SimpleJdbcCall(getDataSource()).withProcedureName(spName);
MapSqlParameterSource in = new MapSqlParameterSource();
for (String key : params.keySet()) {
in.addValue(key, params.get(key));
}
template.returningResultSet("items", mapper);
Map<String, Object> out = template.execute(in);
return (List) out.get("items");
}
catch (Exception e) {
logger.error("DataManager executeSP with Mapper (" + spName + ") with params = " + params + e.getMessage() );
throw e;
} catch (......... )
我的问题是,如果第二个存储过程失败,我该如何调用第二个存储过程并回滚它们?
谢谢
答案 0 :(得分:0)
@Transactional(rollbackFor=Exception.class)
public void performBothSProcsTransactionally(){
//executeSP1
//executeSP2
}