什么是幂等

在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。

预防重复提交与幂等接口的区别

防重提的API的表现

第一次提交:
张三工资涨500,数据库update操作,接口返回“操作成功”
后续相同请求:
拒收请求:张三工资涨500,接口直接返回“请勿重复提交”

幂等接口的表现

第一次提交:
接收请求:张三工资涨500,数据库update操作,接口返回“操作成功”
后续相同请求:
接收请求:张三工资涨500,数据库不做任何写操作,接口返回“操作成功”

幂等问题是如何产生的

程序重复提交

ec30a03f7e5c8bcee06c3e5976e06f80_1620.png
MQ自带的重试机制

20231112212240.png

幂等性接口方案

业务属性保障幂等

利用主键生成器或者唯一性约束确保数据唯一
伪代码

String orderId = "AJHS-00387-KA";
Order order = new Order();
order.setOrderId(orderId);
try{
	dao.insert(orderId,orderObj)
    return "{code:0}";
}catch(SQLException e){
    //捕捉唯一性约束
	//同样返回成功
    return "{code:0}";
}

额外的状态字段与业务逻辑控制

工作流程根据状态判断

工作节点编号上下文数据节点状态
328112...已结束
328113...进行中
328114昨天开黑去了已就绪

申请预置令牌

令牌服务器

6620231112214605.png

本地消息事件表

66620231112214636.png

特别提示

注意:悲观锁与乐观锁并不能解决幂等问题,只能解决并发冲突问题。很多老手给弄混了
悲观锁锁定资源

fsfafasa111.png

基于版本的乐观锁

detydfafda2343.png