新实体的多个条件插入会在 R2DBC 中产生重复条目错误
Posted
技术标签:
【中文标题】新实体的多个条件插入会在 R2DBC 中产生重复条目错误【英文标题】:Multiple conditional inserts of a new entity gives duplicate entry error in R2DBC 【发布时间】:2021-02-21 01:11:35 【问题描述】:让我们考虑这个函数
@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()
【问题讨论】:
我没有看到处理它的部分,你能详细说明吗? 条件插入函数首先尝试按 ID 获取实体,只有当具有该 ID 的实体不可用时,它才会插入该实体(switchIfEmpty 部分) 【参考方案1】:意识到这是使用 flatMap 而不是 concatMap 的问题。 与 flatMap 不同,ConcatMap 按顺序从各个发布者那里收集结果。 (更多here)
因为我使用了 flatMap,多个发布者认为该实体在 DB 中不可用
【讨论】:
我相信还有一个问题,即switchIfEmpty。 switchIfEmpty 被热切地评估。请阅读此***.com/questions/54373920/…。当实体已经存在于数据库中时,您是否进行了单元测试??以上是关于新实体的多个条件插入会在 R2DBC 中产生重复条目错误的主要内容,如果未能解决你的问题,请参考以下文章
在 R 中转换 POSIXct 会在 3.5.0 版中产生 NA [重复]
将 Backand 字段类型从字符串更改为浮点数,生成有效模型会在新模式中产生错误