如何在单个休眠会话中 运行 两个 Spring 事务?
How to run two Spring transactions in a single hibernate Session?
我知道,有一种方法可以降低到较低级别 - 获取连接并在单个休眠会话中手动执行两个事务。
但问题是 - 如何通过@Transactional 注释调用同一会话中的第二个嵌套事务(不使用 "low level hacks" 或手写自定义事务管理)?
一些可能的代码:
@Service
public class DoubleTransaction {
@Autowired
private SessionFactory sf;
@Autowired
private NestedTeHandler nestedHandler;
@Transactional
void invokeTransaction() {
Session cs = sf.getCurrentSession();
Session nestedCs = nestedHandler.invokeNested(sf);
System.out.println(cs == nestedCs);
}}
@Service
public class NestedTeHandler {
@Transactional
Session invokeNested(SessionFactory sf) {
return sf.getCurrentSession();
}}
你也许可以用
做到这一点
@org.springframework.transaction.annotation.Transactional(propagation = Propagation.NESTED)
于 NestedTeHandler.invokeNested
。请参阅 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html 处的文档。
另见这个问题:Differences between requires_new and nested propagation in Spring transactions。
我知道,有一种方法可以降低到较低级别 - 获取连接并在单个休眠会话中手动执行两个事务。
但问题是 - 如何通过@Transactional 注释调用同一会话中的第二个嵌套事务(不使用 "low level hacks" 或手写自定义事务管理)?
一些可能的代码:
@Service
public class DoubleTransaction {
@Autowired
private SessionFactory sf;
@Autowired
private NestedTeHandler nestedHandler;
@Transactional
void invokeTransaction() {
Session cs = sf.getCurrentSession();
Session nestedCs = nestedHandler.invokeNested(sf);
System.out.println(cs == nestedCs);
}}
@Service
public class NestedTeHandler {
@Transactional
Session invokeNested(SessionFactory sf) {
return sf.getCurrentSession();
}}
你也许可以用
做到这一点@org.springframework.transaction.annotation.Transactional(propagation = Propagation.NESTED)
于 NestedTeHandler.invokeNested
。请参阅 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html 处的文档。
另见这个问题:Differences between requires_new and nested propagation in Spring transactions。