【发布时间】:2021-09-26 14:15:00
【问题描述】:
我有多个服务都接收请求 示例请求有 3 个字段 - 货币、日期、金额
现有表有 2 个条目
密钥、货币、日期、金额
123,美元,8 月 1 日,100
234,欧元,12 月 1 日,50
插入盒
如果表中不存在具有接收到的货币、日期组合的条目,则插入一个新条目。 例如对于上表,如果我们收到 (USD, 2 Aug, 20),将插入新条目
更新案例
如果表中已存在接收货币的条目,则通过更新“金额”字段来更新日期组合现有条目 例如对于上表,如果我们收到(USD,8 月 1 日,30 日),现有条目将更新 123,更新后的金额将为 100+30 = 130
场景问题
在 kubernetes/类似平台上运行的服务有 3 个实例,并且以下三个服务大约在同一时间接收请求 第一项服务收到请求(美元,9 月 1 日,100) 第二个服务收到请求(美元,9 月 1 日,200) 第三个服务收到请求(美元,9 月 1 日,300)
理想情况应该是,无论哪个服务先处理,都会创建第一个插入条目,其余两个服务将更新该条目的数量
期望的最终结果:
美元,9 月 1 日,600
但是,观察到的结果之一是,在 2 个服务最终插入记录的情况下,根据应用层处理,第三个条目可能会失败,因为它找不到唯一条目来更新金额,或者它最终更新基于数据库的返回条目之一
美元,9 月 1 日,100
美元,9 月 1 日,500
问题
应该如何以及在哪里处理?在数据库中使用锁还是在Java应用层?
【问题讨论】:
-
2 个服务如何最终插入记录?您的数据库没有唯一约束吗?
-
目前没有唯一约束。那么,如果添加了唯一约束,对于上述情况,在(货币,日期)上,那么可以防止插入吗?此外,尝试插入记录的其他服务将失败,因为该条目已由第一个服务插入。这种情况下,如何重试更新记录
标签: java database hibernate mariadb microservices