【问题标题】:Multiple conditional inserts of a new entity gives duplicate entry error in R2DBC新实体的多个条件插入会在 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{} 部分)

标签: kotlin spring-webflux spring-data-r2dbc r2dbc r2dbc-postgresql


【解决方案1】:

意识到这是使用 flatMap 而不是 concatMap 的问题。 与 flatMap 不同,ConcatMap 按顺序从各个发布者那里收集结果。 (更多here

因为我使用了 flatMap,多个发布者认为该实体在 DB 中不可用

【讨论】:

  • 我相信还有一个问题,即switchIfEmpty。 switchIfEmpty 被热切地评估。请阅读此stackoverflow.com/questions/54373920/…。当实体已经存在于数据库中时,您是否进行了单元测试??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 2010-10-23
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多