我正在使用带有 webflux 的 spring-boot 2.4.2 来连接到 postgres 数据库。我在使用时观察到一种@Transactional
我不理解的行为。
为了展示这种行为,我创建了一个示例应用程序,它尝试将行添加到两个表中;表“a”和表“b”。对表“a”的插入预计会因重复键违规而失败。鉴于使用了事务性,我希望不会将任何行添加到表“b”中。
但是,根据我注释的方法,@Transactional
我会得到不同的结果。
如果我注释控制器方法,事情会按预期工作,并且不会向表 B 添加任何行。
@PostMapping("/")
@Transactional
public Mono<Void> postEntities() {
return demoService.doSomething();
}
DemoService 看起来像这样:
public Mono<Void> doSomething() {
return internal();
}
public Mono<Void> internal() {
Mono<EntityA> clash = Mono.just(EntityA.builder().name("clash").build()).flatMap(repositoryA::save);
Mono<EntityB> ok = Mono.just(EntityB.builder().name("ok").build()).flatMap(repositoryB::save);
return ok.and(clash);
}
如果我将@Transactional
注释从控制器移动到doSomething()
,那么事务仍然按预期工作。但是,如果我将@Transactional
注释移至internal()
,则事务不会按预期工作。一行被添加到表“b”。
这个例子的完整代码在这里:https ://github.com/alampada/pg-spring-r2dbc-transactional
我不明白为什么将注释移动到internal()
方法会导致事务处理出现问题。你能解释一下吗?