postgresql - 如何处理两个冲突插入更新并行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 将是从代码传递的密钥。
解决方案
使您的数据库插入操作成为事务(什么是数据库事务?),简而言之,它要么完成所有事情,要么什么都不做。
您没有发布后端代码,但作为参考,它可以像这样在 Spring Boot 中完成https://spring.io/guides/gs/managing-transactions/
推荐阅读
- flutter - 通过 GlobalKey 颤振形式的人口
- javascript - 如何加载 gif 然后在 discord.js 中使用画布添加文本和图像
- java - CollapsingToolbarLayout 折叠时隐藏TextView,展开时显示
- arrays - 当数组中没有任何内容时,如何从数组 eltype 中删除 Nothing?
- r - 使用向量来索引 R 中的 data.frame
- android - Android ConstraintLayout 不遵守准则
- python - 如何在python中从现在开始一周的约会?
- c# - JObject 属性上的 FluentValidation 以验证 MustBeSafeJson()
- python - 函数“pop”返回错误。我正在尝试删除列表中的一个元素
- python - Ubuntu 服务器 将 python 版本 3.8.6 切换到 3.8.1