在一个事务中调用两个Spring StoredProcedures

时间:2013-12-06 15:12:54

标签: stored-procedures spring-jdbc

我们正在改变遗留应用程序的体系结构以使用Spring JDBC。

应用程序需要在一个事务中连续调用两个存储过程。存储过程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)

我在一种方法中从服务中调用这两种方法:

@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);
    }
}

所有内容都正确连接并调用每个过程。但是,第二个过程就像第一个过程没有运行一样。我怀疑Spring在执行调用期间在连接上调用'commit',但这只是一个理论。

我没有看到如何将两个类合并为一个,因为StoredProcedure构造函数采用特定存储过程的名称,并且似乎只是为了包装一个存储过程。

0 个答案:

没有答案