赞
踩
幂等性说的是:如何防止接口的重复无效请求。
对于一个接口而言,无论调用了多少次,最终得到的结果都是一样的。
四种解决方法:
begin; # 1.开始事务
select * from table_name where id='xxx' for update; # 2.查询状态
insert into table_name (id) values ('xxx'); # 3.添加操作
update table_name set status='xxx'; # 4.更改操作
commit; # 5.提交事务
在实现的过程中需要注意以下两个问题:
在每次执行业务之前,先执行插入操作,因为唯一字段就是业务的 ID,因此如果重复插入的话会触发唯一约束而导致插入失败。在这种情况下(插入失败)我们就可以判定它为重复提交的请求。
版本号实现乐观锁。
update table_name set version=version+1 where version=0;
不使用分布式的情况下可以使用这种方式。
使用 Lock 或者 Synchronized 实现。
流程:
比如说用redis实现分布式锁:
127.0.0.1:6379> set lock true ex 30 nx
OK # 创建锁成功
因为 nx 是 not exist,所以,如果创建锁成功,表示请求成功,否则表示重复请求,不做处理。
实现幂等性的关键步骤分为以下三个:
说明:本文内容整理自拉钩教育《java源码剖析34讲》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。