WebFlux中mongo操作-Transaction




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@PostMapping("/test")
public Mono testA(@RequestParam boolean exception) {
return embedService.saveAC(new ADocument("张三"), new CDocument("李四"), exception);
}

@Override
public Mono<Boolean> saveAC(ADocument aDocument, CDocument cDocument, boolean exception) {
return reactiveMongoTemplate.inTransaction()
//所有文档的持久化操作都只能在单独一个execute函数中汇总实现
.execute(action -> action.insert(aDocument)
.flatMap(a -> {
cDocument.setName(a.getName() + "copy");
return action.insert(cDocument)
.map(d -> {
if (exception) {
//测试跨文档的异常回滚
throw Exceptions.propagate(new RuntimeException("模拟异常的出现"));
}
return d;
});
})
)
//如果里面是个mono,则用next取出第一个元素就是里面的mono
.next()
.map(list -> {
//需要注意,在execute之外的函数中产生的异常,不会触发事务的回滚。
// if (exception) {
// throw Exceptions.propagate(new RuntimeException("模拟异常的出现"));
// }
return Boolean.TRUE;
});
}

flux的数据库操作,在有事务的前提下不能用flatMap,要用事务不能用flatMap要用concatMap保持有序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@PostMapping("/test")
public Mono testA(@RequestParam boolean exception) {
return embedService.saveAC(new ADocument("张三"), new CDocument("李四"), exception);
}

@Override
public Mono<Boolean> saveAC(ADocument aDocument, CDocument cDocument, boolean exception) {
return reactiveMongoTemplate.inTransaction()
//所有文档的持久化操作都只能在单独一个execute函数中汇总实现
.execute(action -> Flux.fromIterable("1", "2", "3")
//如果是个flux此处要用concatMap保持有序不能用flatMap
.concatMap(i -> action.insert(aDocument)
.flatMap(a -> {
cDocument.setName(a.getName() + "copy");
return action.insert(cDocument)
.map(d -> {
if (exception) {
//测试跨文档的异常回滚
throw Exceptions.propagate(new RuntimeException("模拟异常的出现"));
}
return d;
});
}));
)
//如果里面返回的就是一个flux则不需要使用next
//.next()
.map(list -> {
//需要注意,在execute之外的函数中产生的异常,不会触发事务的回滚。
// if (exception) {
// throw Exceptions.propagate(new RuntimeException("模拟异常的出现"));
// }
return Boolean.TRUE;
});
}