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){