Stored procedures 在一个事务中调用两个Spring StoredProcess

Stored procedures 在一个事务中调用两个Spring StoredProcess,stored-procedures,spring-jdbc,Stored Procedures,Spring Jdbc,我们正在将遗留应用程序的体系结构更改为使用SpringJDBC 应用程序需要在一个事务中调用一行中的两个存储过程。存储过程A注册运行存储过程B所需的安全令牌: BEGIN package_a.a('token'); END; BEGIN package_b.b('foo','bar','baz'); END; 我已经为以下每一项创建了Spring存储过程: @Component public class SecurityTokenSP extends StoredProcedure {

我们正在将遗留应用程序的体系结构更改为使用SpringJDBC

应用程序需要在一个事务中调用一行中的两个存储过程。存储过程A注册运行存储过程B所需的安全令牌:

BEGIN package_a.a('token'); END;
BEGIN package_b.b('foo','bar','baz'); END;
我已经为以下每一项创建了Spring存储过程:

@Component
public class SecurityTokenSP extends StoredProcedure {
    @Autowired
    public SecurityTokenSP(DataSource ds) {
        super(ds, "package_a.a");

        declareParameter(new SqlParameter("token", Types.VARCHAR));

        compile();
    }

    public void setToken(String token) {
        Map<String, Object> inputParams = new HashMap<String, Object>();
        inputParams.put("token", token);

        execute(inputParams);
    }
}

// Similar code for procedure B (FooBarBazSP)
一切都连接正确,每个过程都被调用。但是,第二个过程的作用就像第一个过程没有运行一样。我怀疑Spring在执行调用期间正在对连接调用“commit”,但这只是一个理论


我不知道如何将这两个类合并为一个类,因为StoredProcedure构造函数采用特定存储过程的名称,并且似乎设计为只包装一个存储过程。

是否检查了连接是否未处于自动提交模式?Spring不会使用您的配置自行提交。我使用的连接配置与我在许多Spring项目中使用的连接配置相同,并且没有做任何事情来显式启用自动提交。请尝试在连接的提交方法上设置断点,或者使用p6spy来确定代码是否真的提交,这是实际问题。请发布您的连接设置,只是为了查看一下。可能事务设置不正确。删除2行并抛出异常以查看堆栈跟踪。您应该在堆栈跟踪中看到$Proxy。
@Service
public class MyService {
    @Autowired
    private SecurityTokenSP securityTokenSP;
    @Autowired
    private FooBarBazSP fooBarBazSP;

    @Transactional(propagation = Propagation.MANDATORY, rollbackFor = Exception.class)
    public void doIt(String foo, String bar, String baz) {
        securityTokenSP.setToken("myToken");
        fooBarBazSP.doIt(foo, bar, baz);
    }
}