【发布时间】:2014-04-18 02:17:41
【问题描述】:
我正在使用 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 (......... )
我的问题是,如果第二个存储过程失败,我如何调用第二个存储过程并回滚它们?
谢谢
【问题讨论】:
标签: spring stored-procedures transactions