首页 > 解决方案 > 微服务中的数据库表并发问题

问题描述

如果多个应用程序正在读取和写入数据库表,如何处理与并发相关的问题?这种情况可能并不特定于微服务。

手术 地位
GET_ORDER 完全的
计算价格 跑步

一个非常基本的用例:上表中写入了多个应用程序。在写入之前,他们检查相同的操作是否已经存在于 RUNNING 状态。如果不存在,他们插入条目。否则他们只是跳过。读写操作都是简单的 SQL 查询。

问题是 - 2 个不同的应用程序可以同时读取并发现没有“CREATE_INVOICE”操作正在运行,因此它们都将其插入到现在看起来像这样的表中:

手术 地位
GET_ORDER 完全的
计算价格 跑步
CREATE_INVOICE 跑步
CREATE_INVOICE 跑步

因此,该表有两条重复的 CREATE_INVOICE 记录。除了对表应用唯一约束之外,还有什么方法可以解决这个问题?

标签: databaseconcurrencymicroservicesisolation-leveldistributed-transactions

解决方案


“2 个不同的应用程序”是指有两个完全独立的应用程序创建发票,还是同一应用程序的两个实例?

如果是前者,我会很好奇为什么有两个应用程序做同样的事情写入同一个数据库。

如果是后者,这些实例将需要以某种方式进行协调(表上的唯一性约束就是这种协调的一个示例),重要的是要注意这种协调使应用程序更有状态。

我首选的处理方式是事件驱动(例如通过利用数据库更改数据捕获)和分片:例如,当在数据库GET_ORDER中标记记录时COMPLETE(导致发布 CDC 记录),基于订单 ID,该 CDC 记录始终路由到发票创建应用程序(或价格计算应用程序;您的第二个表似乎暗示发票创建可以与价格计算同时)中的同一分片,从而避免冲突。


推荐阅读