我的 Spring Boot 应用程序有一个奇怪的行为。
该应用程序有在视图中打开会话 to false.
我有一个控制器和一个服务,公开了 2 个带注释的方法@交易.
应用程序属性:
spring.jpa.open-in-view=false
我的服务:
@Service
public class MyService {
@Transactional(transactionManager = "myTx")
public void doA(Integer objectId) {
Object o = repo.findMyObject(objectId);
updateMyObject(o);
repo.save(o);
}
@Transactional(transactionManager = "myTx")
public void doB(Integer objectId) {
Object o = repo.findMyObject(objectId);
updateMyObjectDifferently(o);
repo.save(o);
}
}
我的控制器(案例1):
@RequestMapping("/do/{myId}")
public String do(Model model, HttpServletRequest request) {
service.doA(myId);
service.doB(myId);
return "page";
}
在调试 SQL 时,我看到 SELECT 查询是在调用服务期间执行的。
但我看到仅 1 次冲洗(多次更新),当 service.doB() 完成并且该方法周围的 TransactionInterceptor 启动方法 invokeWithinTransaction 时就完成了,这很奇怪。
由于这两个方法都有@Transactional,我本来希望看到2同花:第一次刷新在 service.doA() 结束时进行,第二次刷新在 service.doB() 结束时进行。
更奇怪的是,如果我评论第二个电话,那么
我的控制器(案例2):
@RequestMapping("/do/{myId}")
public String do(Model model, HttpServletRequest request) {
service.doA(myId);
//service.doB(myId);
return "page";
}
在情况 1 中,就像 service.doA() 知道第二个调用将在同一对象上到达,因此它不会提交/刷新事务并等待 service.doB() 结束。
为什么我只看到 1 个同花?
是因为这两个调用都是针对某个数据库对象吗?
我认为我对@Transactional 的了解还可以。
但现在,我迷路了。