项目常用到的口述

口述订单是如何流转的:

用户下单后订单处于待支付的状态 ,用户支付成功后订单为派单中的状态,机构或个人服务人员通过抢单或派单以后,订单处于待服务的状态,服务人员上门服务时订单处于服务中的状态,服务完成后,订单更改为订单完成的状态 当订单处于待支付和派单中时用户可以直接取消订单,在待支付时取消 直接将订单的状态更改为已取消,派单中的和待服务中的订单 自动退款并修改成已关闭

下单时事务失效问题

向数据库中添加订单的时候service方法事务失效的原因是什么?

首先Spring进行事务控制是通过代理对象进行的 而this就是原始对象本身并不是代理对象,所以并不是通过代理对象调用的add(),执行前并没有开启事务

循环依赖解决方案

在OrdersCreateServiceImpl注入OrdersCreateServiceImpl的代理对象,通过代理对象去调用add方法.

Spring 的解决方案

Spring 通过三级缓存机制提前暴露未完全初始化的对象,巧妙地解决了这个问题。以下是通俗版的流程:

如何防止用户重复下单的

为了在项目中防止防止用户重复下单我用到了分布式锁加AOP技术 使用了自定义注解 @LOCK 用来标记需要加锁的方法,注解包含 几个关键的属性一个是formatter用来定义锁的格式 还有 用锁时间和阻塞等待时间以及自动是否自动解锁 是否开启看门狗 通过spel解析器动态解析注解中的formatter属性生成唯一的锁key 在进入方法之前尝试得到锁 如果在未阻塞的情况下 没能得到锁 说明Key重复了 抛出异常 操作频繁

取消订单策略模式

口述:

我在项目中用了策略模式用来取消订单,定义了一个取消订单的接口 然后写一个环境类 把该接口的实现类都初始化到Map中 类上标注了 @Component注解表名该类是一个bean,且键值设置为规定的格式, 通过前端传来的数据将数据转换成与bean上的键值相同的格式 然后就能找到对应的实现类了.

为什么要用lua脚本
  • 多个客户端同时执行这些命令时,可能会出现竞态条件。
  • 例如,两个客户端可能同时检查库存并认为库存充足,然后同时减少库存,导致库存变为负数。

使用 Lua 脚本可以显著提高系统的可靠性和性能。它确保了一系列操作的原子性,避免了竞争条件,并减少了网络通信的次数。如果不使用 Lua 脚本,虽然可以通过手动编写代码来实现相同的功能,但会面临更高的风险和更复杂的实现

抢单模块流转

用户在下单支付后 订单分流插入抢单池 canal读取binlog文件 发送到mq 抢单服务监听到mq的数据 同步数据到redis和es中 抢单服务开始抢单以后 通过redis执行lua脚本扣减库存 写入抢单同步队列(也就是修改数据库)

posted @ 2025-04-16 21:51  JavaYzz  阅读(10)  评论(0)    收藏  举报