多个存储过程调用的spring事务管理

时间:2014-04-18 02:17:41

标签: spring stored-procedures transactions

我使用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 (......... )

我的问题是,如果第二个存储过程失败,我该如何调用第二个存储过程并回滚它们?

谢谢

1 个答案:

答案 0 :(得分:0)

@Transactional(rollbackFor=Exception.class)
public void performBothSProcsTransactionally(){
   //executeSP1

   //executeSP2
}