伪代码

场景

用购买某种商品1件(原库存1000),增加20积分,扣除100元余额

设计说明

通过日志表来完成TCC。修改库存,余额表要先添加一条记录到他们的日志表里,表要记录TCC状态。
通过唯一业务Code去重,保证幂等。
没有抽象一个活动管理器来管理TCC。

服务

  1. 本地创建订单服务createOrder
  2. 本地插入订单Mapper层 insertOrder(orderCode)
  3. 本地其他服务
  4. 远程服务是否可以扣除库存ifReduceStock(orderCode,reduceNumber)
  5. 远程服务是否可以扣除余额ifReduceBalance(orderCode,sum)
  6. 远程服务Try扣除库存,锁住扣除库存tryReduceStock(orderCode,reduceNumber)
  7. 远程服务Try扣除余额,锁住扣除余额tryReduceBalance(orderCode,sum)
  8. 远程服务增加积分
  9. 远程服务Confirm扣除库存confirmReduceStock(orderCode,ReduceNumber)
  10. 远程服务Confirm扣除余额ConfirmReduceBalance(orderCode,sum)
  11. 远程服务Cancel扣除库存,取消占有资源cancelReduceStock(orderCode,ReduceNumber)
  12. 远程服务Cancel扣除余额,取消占有资源cancelReduceBalance(orderCode,sum)
  13. 远程服务增加积分
  14. 远程其他服务
    补充服务:扣除日志超过timeOut时间的记录状态设置为失效Cancel(在是否扣除ifReduce,Confirm操作中调用补充服务)

创建订单服务createOrder描述


图1:创建订单-活动图

触发:用户点击下单

本地,检查

  1. 本地业务服务事务开始
  2. 本地业务服务同步检查(调用远程服务是否可以扣除库存ifReduceStock(orderCode,reduceNumber), 远程服务是否可以扣除余额ifReduceBalance(orderCode,sum),其他)
    调用远程服务是否可以扣除库存ifReduceStock(orderCode,reduceNumber)说明:
    首先,要调用补充服务把日志中超过timeOut时间的记录状态设置为失效Cancel。
    其次,要把日志状态为锁住Try库存从剩余库存剪掉
    余额同上
  3. 生成订单Code(orderCode全世界唯一)
  4. 同步本地业务插入订单Mapper层 insertOrder(orderCode),得到订单
  5. 其他本地业务

Try

  1. 同步调用远程服务Try扣除库存tryReduceStock(orderCode,reduceNumber),锁住扣除库存1
    具体:
    远程添加此次扣除日志(三种方式:数据库,Redis,MongoDB),其他判断是否可以扣除库存务必减去这个库存1(从扣除日志找orderCode相同,状态为锁住Try的操作库存数)
    数据记录主要字段,值:
    orderCode(用于去重)
    原库存,值1000
    此次操作库存,值1
    操作时间(一个用途,用于计算超过某个值timeOut后,把此条记录状态设置为失效Cancel)
    状态(锁住Try,确认Confirm,失效Cancel),值锁住Try

  2. 同步调用远程服务Try扣余额tryReduceBalance(orderCode,sum),锁住扣除余额100
    具体同库存

  3. 同步调用远程服务Try增加积分
    具体同库存(比库存简单一些)
  4. 有任何错误或者异常回滚本地事务。结束。

Confirm,Cancel

  1. 同步调用远程服务Confirm真正扣除库存confirmReduceStock(orderCode,ReduceNumber)
    具体:
    首先,要调用补充服务把日志中超过timeOut时间的记录状态设置为失效Cancel
    其次,扣除日志里找到orderCode,此次操作库存为ReduceNumber1,状态为锁住Try记录,根据此条记录扣减库存。
  2. 失败了。1)Cancel扣除库存,取消占有资源2)回滚本地事务。结束。
  3. 同步调用远程服务Confirm扣除余额ConfirmReduceBalance(orderCode,sum)
  4. 失败了。
    1)Cancel扣除余额,取消占有资源
    2)远程调用服务Cancel扣除库存cancelReduceStock(orderCode,ReduceNumber)还原库存
    具体还原库存:
    除日志里找到orderCode,此次操作库存为ReduceNumber1,状态为确认Confirm记录,根据此条记录还原库存。
    3)回滚本地事务。结束。
  5. 同步远程调用增加积分如果失败同样要还原库存和余额
  6. 本地业务服务事务结束,提交。

问题

1.为什么有些地方可以不进行Cancel操作?因为超过TimeOut会Cancel。
2.秒杀活动等高并发怎么办?秒杀情况下,应在下单前的购买和加入购物车操作做限制。添加一个队列,队列中请求已把库存买光,就不允许进入队列走下单。只有进入队列的才可以下单。使用Redis实现。

TCC 强一致性 实时 DEMO 下单(创建订单,扣除库存,增加积分,扣除余额)相关推荐

  1. 秒杀情况下,用户下单扣除库存创建订单之后,迟迟不付款,时间到了自动取消订单(思路)

    秒杀情况下,用户下单扣除库存创建订单之后,迟迟不付款,时间到了自动取消订单 解决方案1. 使用redis实现 1.下单之后把生成分布式全局唯一id,把订单id放进redis中,设置一个过期时间 2.定 ...

  2. springcloud3 Seata实现订单、库存、账户3者之间的分布式事务3

    一 案例操作 1.1 背景说明 本案例的操作是在第1篇关于seta博客的基础上,后续进行操作的. 案例逻辑:这里有3个服务:一个订单服务,一个库存服务,一个账户服务 1.当用户下单时,会在订单服务中创 ...

  3. 基于MQ的异步创建订单,提高下单并发量

    两种方案:全量异步.半异步.下面分别说明一下两种方案的区别. 全量异步: 1. 前端调用下单接口获取订单id 2. 下单接口构造订单领域对象,并缓存订单id到redis,状态为0(创建中),然后将领域 ...

  4. 创建订单 - 扣除商品库存与订单状态保存

    /*** @Description: 订单状态 枚举*/ public enum OrderStatusEnum {WAIT_PAY(10, "待付款"),WAIT_DELIVER ...

  5. 创建订单 - 填充新订单数据

    /*** @Description: 支付方式 枚举*/ public enum PayMethod {WEIXIN(1, "微信"),ALIPAY(2, "支付宝&qu ...

  6. 使用“即时消息服务框架”(iMSF)实现分布式事务的三阶段提交协议(电商创建订单的示例)...

    1,示例解决方案介绍 在上一篇 <消息服务框架(MSF)应用实例之分布式事务三阶段提交协议的实现>中,我们分析了分布式事务的三阶段提交协议的原理,现在我们来看看如何使用消息服务框架(MSF ...

  7. 创建订单【项目 商城】

    创建订单[项目 商城] 创建订单 1 创建数据表 2 创建实体类 3 持久层 3.1 规划SQL语句 3.2 设计接口与抽象方法 3.3 配置SQL映射 测试 4 业务层 4.1 实现接口与抽象方法 ...

  8. java微信支付v3系列——4.创建订单的封装及使用

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  9. 10天手敲一个SpringBoot网上商城项目(九)—— 确认订单、创建订单功能的实现及AOP

    静态资源及sql文件分享 链接:https://pan.baidu.com/s/1X-yjmQcPD3PqS21x0HplNA?pwd=23gr 提取码:23gr 文章目录 确认订单 1.确认订单-持 ...

最新文章

  1. linux php 安装mysql数据库_linux php安装mysql数据库有哪些方法
  2. iPhone放大模式详解
  3. Windows下 Apache+PHP5+MYSQL5+phpmyadmin 规范安装
  4. C++习题 虚函数-计算图形面积
  5. kafka rabbitmq优劣对比_Kafka、RabbitMQ、RocketMQ等消息中间件的对比
  6. python类的属性打印_python 打印类的属性、方法
  7. apache在线升级yum_基于Redis实现在线游戏积分排行榜 - phyger
  8. 【名词解释】7.UML类图
  9. 封装自己专属的真正的纯净版Windows系统过程记录(4)——进行封装
  10. 常见线缆接口类型总结
  11. 企业级代码静态测试工具Helix QAC——从应用层级保证代码质量和安全
  12. 使用EMQ实现消息推送
  13. 求Decimal的相反数
  14. html5中的 hr定位,被大家遗忘的 hr 标签元素
  15. linux mtd 指令,mtd交叉编译mkfs命令
  16. JS前端弹出警示框和提示框
  17. tensorflow: 花卉分类
  18. 测试管理及项目测试流程
  19. java用一张一元票换一分_一张一分纸币更换两张一元纸币,知道收藏价值后,你也会更换!...
  20. 高楼扔鸡蛋问题 - 动态规划+反推演绎

热门文章

  1. 央企建筑企业如何通过数字化转型实现高质量发展
  2. 记一次Centos安装花生壳的坑
  3. css flex 图片不拉伸_flex布局下img元素被拉伸变形的有效解决办法
  4. Anki 记忆工具使用方法
  5. chrome 浏览器在线翻译插件
  6. 智慧物业小程序_智慧小区物业管理小程序搭建开发有现成案例
  7. 数字化“战疫”进行时,美创产品打造精准数据底座
  8. web页面与多页应用(一)
  9. 基于 python 数据库的可视化股票信息查询系统
  10. 虚拟机时间为什么不是快了就是慢了?