我的 android 設備在 spring 啟動時呼叫一個端點。當兩個設備并行呼叫時 - 第一個呼叫的插入未完成,第二個呼叫同時到達資料庫。第一個呼叫似乎正在生成主鍵,第二個呼叫看到沖突并因此嘗試更新。第一次呼叫應該插入,后續呼叫應該將值增加 1。插入未完成,因此第二次呼叫嘗試更新值。因此它將值更新為 null。后續呼叫 do 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 將是從代碼傳遞的密鑰。
uj5u.com熱心網友回復:
使您的資料庫插入操作成為一個事務(什么是資料庫事務?),簡而言之,它要么完成所有操作,要么什么都不完成。
您沒有發布后端代碼,但作為參考,它可以在 Spring Boot 中完成,如下所示https://spring.io/guides/gs/managing-transactions/
uj5u.com熱心網友回復:
解釋是您的子查詢還沒有找到一行,因為它對事務尚不可見。因此結果為NULL。
使用更簡單的方法避免這種競爭條件
INSERT INTO table1 (primary_key, quantity)
VALUES (:primary_key, :qty)
ON CONFLICT (primary_key)
DO UPDATE
SET quantity = coalesce(table1.quantity, 1) EXCLUDED.quantity;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/331680.html
標籤:PostgreSQL
下一篇:聚合查詢結果
