问题描述
我们的微服务正在调用第三方服务,使用 REST API 访问(读取/更新)共享数据库中的相同记录
- 一位客户购买了 10 件产品 A
- 另一位客户购买了 5 件相同的产品 A
- UI API 在几毫秒内对结束点 /decrementProduct 进行了 2 次调用
- 这两个调用可能最终都会读取到产品 A 的相同库存数量,并且都将根据它们读取的库存数量减少产品 A 的采购单位。
示例:
- 调用前的库存计数:10
- 调用 1 从 10 减少 5 个单位,并更新回 5 作为当前库存计数。
- 调用 2 从 10 减 2 个单位,然后更新回 8 作为当前库存计数。
- 调用后的库存计数:8
- 调用后正确的库存计数应为:3
用例 2:多个微服务多次调用访问同一记录
由于更新数据库中相同记录的调用次数,用例 1 中解释的问题在这种情况下会加剧。
修改:2021 年 4 月 13 日 共享数据库使用 REST API 向我们的微服务公开,我们无法控制物理数据库和公开的 REST API,无法在数据库级别实现任何事务或锁定机制。
解决方法
我不知道您使用的是哪个数据库,但传统的关系数据库,例如:oracle、postgresql、mysql、db2 等...已经在正在更新的记录中使用锁来解决这些问题,以确保有不是并发问题。
我的意思是,如果您打开一个事务,在其中读取一个值然后更新它,则不会有任何问题,因为如果您尝试使用与当前设置的版本号不同的版本号更新数据库中的一行(一个过时的版本),数据库不会让更新它