274集 E:\BaiduNetdiskDownload\谷粒商城\课件和文档\高级篇\课件\02、接口幂等性.pdf
解决方法:
token 令牌机制
token是存在redis里的
1查询得到token
2对比redis里的token和前端页面传过来的token
3对比成功删除token(这样后面来的请求就拿不到token)
对比成功删除tokrn后执行业务操作
123操作必须是原子性 可用Lua脚本保证原子性
锁机制
1、数据库悲观锁
select * from xxxx where id = 1 for update;
悲观锁使用时一般伴随事务一起使用,数据锁定时间可能会很长,需要根据实际情况选用。 另外要注意的是,id 字段一定是主键或者唯一索引,不然可能造成锁表的结果,处理起来会 非常麻烦。
2、数据库乐观锁 这种方法适合在更新的场景中,
update t_goods set count = count -1 , version = version + 1 where good_id=2 and version = 1
根据 version 版本,也就是在操作库存前先获取当前商品的 version 版本号,然后操作的时候 带上此 version 号。我们梳理下,我们第一次操作库存时,得到 version 为 1,调用库存服务 version 变成了 2;但返回给订单服务出现了问题,订单服务又一次发起调用库存服务,当订 单服务传如的 version 还是 1,再执行上面的 sql 语句时,就不会执行;因为 version 已经变 为 2 了,where 条件就不成立。这样就保证了不管调用几次,只会真正的处理一次。 乐观锁主要使用于处理读多写少的问题
276集
/**
* 点击提交订单执行后的方法 校验请求的令牌(防止重复提交) 锁库存
*/
@Override