如何解决新实体的多个条件插入会在R2DBC中产生重复的输入错误
让我们考虑一下这个功能
@Transactional
fun conditionalInsertEntity(dbEntity: DBEntity): Mono<DBEntity> {
return fetchObjectByPublicId(dbEntity.publicId)
.switchIfEmpty {
r2DatabaseClient.insert()
.into(DBEntity::class.java)
.using(Flux.just(dbEntity))
.fetch()
.one()
.map { it["entity_id"] as Long }
.flatMap { fetchObjectById(it) }
}
}
使用以下驱动程序代码运行上述功能时,如果列表包含重复项,则会出现重复输入错误。理想情况下,不应给出该错误,因为上述功能已经在处理重复插入的情况!
val result = Flux.fromIterable(listOf(dbEntity1,dbEntity1,dbEntity2))
.flatMap { conditionalInsertEntity(it) }
.collectList()
.block()
解决方法
意识到这是使用flatMap而不是concatMap的问题。 与flatMap不同,ConcatMap顺序地从各个发布者收集结果。 (更多here)
由于我使用flatMap,因此多个发布者认为该实体在数据库中尚不可用
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。