新实体的多个条件插入会在 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 字段类型从字符串更改为浮点数,生成有效模型会在新模式中产生错误

如何在 r2dbc 中批量执行多个插入?

实体框架映射问题

为啥 SQLite 替换功能会在我的 Android 应用程序中产生错误?

为啥字节和短除法会在 Java 中产生 int?