2023年11月26日发(作者:)
Java接⼝幂等性多种解决⽅案
Java接⼝幂等性的解决⽅案:
java 语⾳中,同⼀个接⼝相同的参数多次和⼀次请求产⽣的效果是⼀样,这样的过程即被称为满⾜幂等性
//这中情况⽆论执⾏多少次,结果都不受影响,是幂等的。
update user set age = 25 where user_id = 2
//这样的更新语句每执⾏⼀次,结果都会不⼀样,是⾮幂等的。
update user set user_num = user_num + 1 where user_id = 2
⽽对⾮幂等性的接⼝防⽌重复提交(如果幂等性的接⼝重复提交,理论上不会有问题),就是我们今天要解决的问题:
1、jvm加锁⽅式
调⽤java中的内置锁synchronized或显⽰锁Lock加锁。
单体架构下,新增数据,新增之前需要先查询数据库是否已经存在此数据,查询之前加锁,执⾏完插⼊数据后释放锁。
注意:此⽅案不适合微服务集群环境下,此类锁值对当下的单体服务起作⽤;多个通知经过负载均衡转发到不同的机器,上⾯的锁就不起效
了。
2、数据库加悲观锁⽅式:
新增之前查询,数据库悲观锁类似于⽅式⼆中的Lock,只不过是依靠数据库来实现的。数据中悲观锁使⽤for update来实现
select * from user where id = 1 for update;
重点在于 for update,解释如下:
try{
insert into user (type_type,order_id) values (1,order_no);
//提交本地事务:
}catch(Exception e){


发布评论