Spring/Hibernate,在两个物理交易之间共享会话

Spring/Hibernate, share Session between two Physical Transactions

Spring 和 Hibernate 是否支持两个不同(嵌套或顺序)物理 事务之间的会话共享?

我知道Spring支持嵌套事务,但它是同一个物理事务,只是带有保存点,即嵌套事务在逻辑上是分开的:

来自 Spring 文档:

PROPAGATION_NESTED uses a single physical transaction with multiple savepoints that it can roll back to.

那么,我能否实现类似于以下的行为:

@Transactional
void invokeOuterTransaction() {
    invokeInnerTransaction();
}
@Transactional
void invokeInnerTransaction() {
    // here are the same Session as in 'invokeOuterTransaction', 
    // but this transaction is new PHYSICAL transaction
}

因此,使用下面的设置探索这个问题,我发现 Hibernate Session "per request" 而不是 "per transaction" 非常有趣。

设置: 休眠 5,Spring5,PostgreSQL

下面是一个简短的 java-like pseudo-code:

@Controller {
    @Inject FirstService fServ;
    @Inject SecondService sServ;

    @RequestMapping
    handleHttpRequest() {
          fServ.invokeFirstTransactional();
          sServ.invokeSecondTransactional();
    }
}
FirstService {
   @Transactional
   void invokeFirstTransactional() {
        // Session object system hashcode = 187000543
        // Thread object system hashcode = 167000522

        // Transaction_ID in database = 650
   }
}
SecondService {
   @Transactional
   void invokeSecondTransactional() {
        // Session object system hashcode = 187000543
        // Thread object system hashcode = 167000522

        // Transaction_ID in database = 651
   }
}

如您所见 - 相同的 Hibernate 会话、相同的线程,但不同的物理事务!