Java Spring-在事务中调用两个存储过程,但在自动提交模式下运行每个过程

Java Spring-在事务中调用两个存储过程,但在自动提交模式下运行每个过程,java,sql-server,spring,stored-procedures,spring-transactions,Java,Sql Server,Spring,Stored Procedures,Spring Transactions,我在Spring事务中调用了两个第三方存储过程,如下所示: @Transactional public void testGetHoldings() throws SQLException { // calls stored procedure get_session myRepo.getSession(login.getUser(), login.getPassword()); // calls stored p

我在Spring事务中调用了两个第三方存储过程,如下所示:

    @Transactional
    public void testGetHoldings() throws SQLException {
       // calls stored procedure get_session           
       myRepo.getSession(login.getUser(), login.getPassword());

       // calls stored procedure get_data
       myRepo.getData("aDataId");       
    }
事务是必需的b/c第一个存储过程生成会话密钥。会话密钥只能由同一事务中的另一个sp调用(如get_data)使用。此外,get_数据存储过程中的每个语句都需要在执行时提交。比如说,

ALTER procedure [dbo].[get_data]
      @aDataId varchar(max)
as
begin
  -- just an example insert. actual sp has a lot of code and several inserts that
  -- must be committed immediately upon execution
   insert into tbl (col1) values ("col1")
end
但是,
@Transactional
会导致每次插入都要等到sp完成后才能提交


如何使两个存储过程位于同一事务中,但允许在语句执行时提交存储过程中的语句(即自动提交)?第三方sp位于SQL Server中。

我不确定您想做什么,如果您想让第二个sp看到第一个sp生成的密钥是可以的,请在一个事务中执行它们,但您无法打开事务并执行两次提交,这是不可能的,如果第一次提交成功,第二次提交导致错误,该怎么办,在本例中,事务有两个rollback ALEVE语句。如果希望SP独立运行,请在两个不同的事务中运行它们。第二个SP使用并且必须看到第一个SP生成的密钥。从我所知,密钥未提交到DB,因此第二个SP必须在同一事务中。但是,第二个SP执行insert并调用其他一些非SQL代码来尝试读取insert。非SQL代码只读取提交的数据。SQL代码等待非SQL代码进行插入,然后继续。这就是为什么第二个SP在执行时必须提交每一行的原因。在这种情况下,打开两个单独的读提交事务,第一个事务将插入一个值并提交结果,然后第二个事务将能够读取插入的行,因为第二个事务具有读提交隔离级别