首页 > 解决方案 > 如何处理两个冲突插入更新并行postgres查询

问题描述

我的 android 设备在 spring boot 中调用了一个端点。当两个设备并行调用时 - 第一个调用的插入未完成,第二个调用同时到达数据库。第一次调用似乎正在生成主键,而第二次调用看到了冲突,因此尝试更新。第一次调用应该插入,后续调用应该将值增加 1。插入未完成,因此第二次调用尝试更新值。因此它将值更新为空。随后的调用执行 value + 1 因此它们再次更新 null。我如何处理这种情况以确保一个调用锁定行或如何解决这个问题?

insert
    into
    table1 (primary_key,
    quantity)
values(:primary_key,
:qty) on
conflict primary_key do
update
set
    quantity = (
    select
        coalesce(quantity, 1) + :qty
    from
        table1
    where
        primary_key = :primary_key)
where
    primary_key = :primary_key;

注意 - :qty 将为 1 并且 :primary_key 将是从代码传递的密钥。

标签: postgresql

解决方案


使您的数据库插入操作成为事务(什么是数据库事务?),简而言之,它要么完成所有事情,要么什么都不做。

您没有发布后端代码,但作为参考,它可以像这样在 Spring Boot 中完成https://spring.io/guides/gs/managing-transactions/


推荐阅读