Spring / Hibernate,在两个物理事务之间共享Session

时间:2018-04-05 14:17:44

标签: java spring hibernate transactions spring-transactions

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

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

来自Spring docs:

  

PROPAGATION_NESTED使用具有多个保存点的单个物理事务,可以回滚到该保存点。

所以,我能否实现类似的行为:

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

1 个答案:

答案 0 :(得分:0)

所以,使用下面的设置探索这个问题,我发现,Hibernate Session“按请求”而不是“每个事务”非常有趣。

设定: Hibernate 5,Spring 5,PostgreSQL

以下是一个类似Java的快速伪代码:

@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会话,相同的线程,但不同的物理交易!