簡體   English   中英

多個pods/微服務更新/插入同一條記錄

[英]Multiple pods/micro-services update/insert the same record

我有多個服務都接收請求示例請求有 3 個字段 - 貨幣、日期、金額

現有表有 2 個條目

密鑰、貨幣、日期、金額

123,美元,8 月 1 日,100

234,歐元,12 月 1 日,50

插入案例

如果表中不存在具有接收貨幣、日期組合的條目,則插入一個新條目。 例如對於上表,如果我們收到 (USD, 2 Aug, 20),將插入新條目

更新案例

如果表中已存在具有接收貨幣的條目,則通過更新金額字段來更新現有條目的日期組合,例如對於上表,如果我們收到 (USD, 1 Aug, 30),則現有條目將更新 123 並且更新后的金額將是 100+30 = 130

場景問題

在 kubernetes/類似平台上運行的服務有 3 個實例,以下三個服務大約在同一時間收到請求 第一個服務收到請求(USD,1 Sep,100) 第二個服務收到請求(USD,1 Sep,200) 第三個服務收到請求(美元,9 月 1 日,300)

理想情況應該是,無論哪個服務先處理,將創建第一個插入條目,其余兩個服務將更新該條目的數量

想要的最終結果:

美元,9 月 1 日,600

但是,觀察到的結果之一是,在 2 個服務最終插入記錄的情況下,根據應用程序層處理,第 3 個條目可能會失敗,因為它找不到唯一條目來更新數量,或者最終更新其中之一基於數據庫的返回條目

美元,9 月 1 日,100

美元,9 月 1 日,500

奎斯頓

應該如何處理以及在哪里處理? 在數據庫中使用鎖還是在Java應用層?

這似乎是一個並發問題,我想您正在執行兩個查詢來執行此操作。 首先,您嘗試在數據庫中查找記錄,其次,根據它是否存在進行更新或插入。 但是,如果兩個請求同時(或幾乎同時)到達,則兩者進行第一個查詢,並且由於該貨幣不存在,它們會執行插入操作。

為了解決這個問題,我將按照 Kayaman 的建議在貨幣中添加一個唯一約束,並將查詢更改為 upsert(它是某些數據庫支持的更新和插入查詢的組合)以使查詢原子化,因此如果插入失敗,因為已經有一個使用相同貨幣的記錄,它將進行更新

這是有關如何在 Postgresql 中執行 upsert 的文檔https://www.postgresqltutorial.com/postgresql-upsert/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM