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