以下订单流程为例:
begin; // 开启事务 Stock.reduce(); // 调用库存模块: 查询库存、SQL 减库存、删除库存相关缓存 User.pay(); // 调用用户模块:查询余额、SQL 扣减余额、清除余额缓存 Order.create(); // 调用订单模块:SQL 插入订单、删除订单相关缓存 commit; // 提交事务 上面的逻辑实际上是先清除了缓存,再更新数据库(提交事务),不是 Cache Aside Pattern,在并发情况下会导致缓存不一致。把代码改成:
begin; // 开启事务 Stock.reduce(); // 调用库存模块: 查询库存、SQL 减库存 User.pay(); // 调用用户模块:查询余额、SQL 扣减余额 Order.create(); // 调用订单模块:SQL 插入订单 commit; // 提交事务 Stock.clear(); // 清除缓存 User.clear(); Order.clear(); 这样才是先更新数据库再清除缓存。但问题是,库存缓存属于库存模块的内部实现,不应该把清缓存的方法暴露出去,用户模块、订单模块也是一样。
有事务的情况下,怎么组织代码比较合适?
