当前位置: 首页 > 知识库问答 >
问题:

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

萧远
2023-03-14

我正在使用Spring Framework进行数据库调用。我有一个更新,涉及调用2个存储过程,每个过程都在执行多个操作。

我在每个SP中分别定义了以下事务管理:

 DECLARE EXIT HANDLER FOR SQLEXCEPTION 
 BEGIN
    ROLLBACK;
 END;

START TRANSACTION;

     .......logic .........
    COMMIT;

如果我单独调用每个SP,这可以正常工作,但我想在一个事务中完成整个操作,因此如果对第一个SP的调用有效,但对第二个SP的调用失败,它会同时回滚两者。

所以很明显,我需要从sps中删除提交并在Spring端处理它。

目前对于Spring,我使用SimpleJDBCall(下面的代码摘录)

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个答案

华景明
2023-03-14
@Transactional(rollbackFor=Exception.class)
public void performBothSProcsTransactionally(){
   //executeSP1

   //executeSP2
}
 类似资料:
  • 问题内容: Spring JDBC模板调用存储过程的正确方法是什么? 说,我有一个同时声明和参数的存储过程,如下所示: 我遇到了一些基于方法,我们必须显式地注册和参数化。在课堂上考虑以下方法: 当然,我知道我可以这样使用它: 我已经在实现中注册它们的目的是什么?换句话说,为什么我需要传递一个csc春天可以简单地在内部完成的事情?基本上,我不能传递其中一个而不是两个吗? 或者,是否有比我到目前为止遇

  • 我希望API管理服务中的一个API调用CosmosDB中的存储过程并返回其结果。似乎没有太多关于这个主题的文件。 到目前为止我的尝试: null null null

  • 我正在编写一个Spring批处理应用程序: null

  • 本文向大家介绍MSSQL事务的存储过程,包括了MSSQL事务的存储过程的使用技巧和注意事项,需要的朋友参考一下 在酒店管理系统开发中,我们会创建房间表和房间类型表(房型表)这两个表,如下图所示: 房型表:RoomType             房间表:Room   首先这两个表的关系:Room是从表,RoomType是主表,两表有主外键关系,RoomType.rTypeId=Room.rType

  • 我使用JDBC这样调用这个过程: 它向我抛出一个错误,通知调用格式错误。 但是如果我像这样直接在IDE中运行调用:

  • 从1.r.58开始, 支持出参, 之前的版本仅支持入参. 从实现方式上说, 是通过扩展自定义SQL的含义及上下文来实现 仅含义入参的存储过程 // 建表,删除老的存储过程. dao.create(Pet.class, true); dao.insert(Pet.create("wendal")); dao.execute(Sqls.create("DROP PRO