订单系统如何保证数据准确无误

83 阅读1分钟

订单系统核心功能

  1. 创建订单
  2. 更新订单
  3. 查询订单

需要的表:

  1. 订单表:保存订单基本信息
  2. 商品表:保存商品信息
  3. 支付表:保存支付信息
  4. 优惠表:保存优惠信息

关系如下:

image.png

如何避免重复下单

下单服务需要具有幂等性,对于创建订单,同一个请求无论请求多少次都只会创建一条订单记录。 具体的做法是这样的,使用数据库主键唯一约束实现。我们给订单系统增加一个“生成订单号”的服务,这个服务没有参数,返回值就是一个新的、全局唯一的订单号。在用户进入创建订单的页面时,前端页面先调用这个生成订单号服务得到一个订单号,在用户提交订单的时候,在创建订单的请求中带着这个订单号,订单号生成尽量保证单调递增,比如:snowflake。在数据库中把订单号作为主键,插入已存在的订单号数据时会失败。

时序图:

image.png

如何解决ABA问题

问题时序图:

image.png

解决方法:在订单表上加一个version字段,每次更新时需要带上version来更新数据,比较数据库中版本和传入版本一致时采取更新。


此文章为3月Day1学习笔记,内容来源于极客时间《后端存储实战课》