库存信息可以拆分表出来
便于后续扩展
数据封装分了3种
DO 数据库封装对象
Model 业务对象
VO 前端返回对象
扣减库存和订单入库 可用性没有保证
既不是一个事务,也没有双写(比如mq 和 mysql)校对的功能
减库存的思路:
直接通过update加条件 判断影响行数的方法
比
先select库存
然后再扣减的方式更好
一条语句搞定,执行sql的原子性
后者需要执行两条sql,还要通过事务保证原子性
订单模块功能
订单校验
通过落单减库存(而不是支付减库存)来解决超卖。
落单减库存实现:
amount:数量 stock:库存
update item_stock set stock = stock - #{amount}where item_id = #{itemId} and stock >= #{amount}
相对于select for update(上锁的操作) 好很多,会先拿amount与数据库的amount作比较,如果传入的amount够的话,对应在Java代码中对数据执行一次操作。这种方式需要发送两条sql语句,并且要完成一次在Java内存的计算。如果使用当前这一条sql语句,其实Transaction内部的话是一个原子操作,但是只需要一条sql语句,相对来说性能好很多
订单号规则
中间6位为自增序列,如果日交益额超过6位数,再相应的增加位数
最后2位为分库分表位 00-99