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 会话、相同的线程,但不同的物理事务!
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 会话、相同的线程,但不同的物理事务!