【发布时间】:2021-04-25 09:18:53
【问题描述】:
我正在使用带有 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() 方法会导致事务处理出现问题。你能解释一下吗?
【问题讨论】:
标签: spring-boot spring-data-r2dbc r2dbc r2dbc-postgresql