当前位置: 首页 > news >正文

泰州建设网站广东seo网站优化公司

泰州建设网站,广东seo网站优化公司,网页设计模板html代码手机版,建设一个商城网站大概多少钱啥是幂等? 客户端对同一API的多次调用应该产生相同的服务器状态。 通俗的说:某个行为重复的执行,最终获取的结果是相同的,不会因为重复执行对系统造成变化。 比如说同步数据的功能,重复可以重复同步,如果…

啥是幂等?

客户端对同一API的多次调用应该产生相同的服务器状态。
通俗的说:某个行为重复的执行,最终获取的结果是相同的,不会因为重复执行对系统造成变化。

比如说同步数据的功能,重复可以重复同步,如果可以就表示是幂等的。

常见场景

​​HTTP方法​​:
幂等方法:GET、PUT、DELETE
非幂等方法:POST、PATCH
​​支付系统​​:重复支付请求不应导致多次扣款
​​订单创建​​:重复提交订单不应创建多个相同订单

实现幂等性的方法

​​唯一标识符​​:为每个操作分配唯一ID,服务器记录已处理ID
​​版本号/时间戳​​:资源更新时携带版本信息
​​状态机​​:确保操作只在特定状态下执行
​​数据库约束​​:利用唯一索引防止重复数据

具体

1 update + where,利用数据库的行级锁保证查询和更新是原子性的。伪代码如下。

String rechargeId = "充值订单id";// 根据rechargeId去找充值记录,如果已处理过,则直接返回成功
RechargePO rechargePo = select * from t_recharge where id = #{rechargeId};// 充值记录已处理过,直接返回成功
if(rechargePo.status==1){return "SUCCESS";
}开启Spring事务// 下面这个sql是重点,重点在where后面要加 status = 0 这个条件;count表示影响行数
int count = (update t_recharge set status = 1 where id = #{rechargeId} and status = 0);// count = 1,表示上面sql执行成功
if(count!=1){// 走到这里,说明有并发,直接抛出异常throw new RuntimeException("系统繁忙,请重试")
}else{//给账户加钱update t_account set balance = balance + #{rechargePo.price} where id = #{rechargePo.accountId}
}提交Spring事务

2 基于版本号的乐观锁

String rechargeId = "充值订单id";// 根据rechargeId去找充值记录,如果已处理过,则直接返回成功
RechargePO rechargePo = select * from t_recharge where id = #{rechargeId};// 充值记录已处理过,直接返回成功
if(rechargePo.status==1){return "SUCCESS";
}开启Spring事务// 期望的版本号
Long exceptVersion = rechargePo.version;// 下面这个sql是重点,重点在set后面要有version = version + 1,where后面要加 status = 0 这个条件;count表示影响行数
int count = (update t_recharge set status = 1,version = version + 1 where id = #{rechargeId} and version = #{exceptVersion});// count = 1,表示上面sql执行成功
if(count!=1){// 走到这里,说明有并发,直接抛出异常throw new RuntimeException("系统繁忙,请重试")
}else{//给账户加钱update t_account set balance = balance + #{rechargePo.price} where id = #{rechargePo.accountId}
}提交spring事务

3 关联一个唯一约束辅助表

-- 幂等辅助表
create table if not exists t_idempotent
(id             varchar(50) primary key comment 'id,主键',idempotent_key varchar(200) not null comment '需要确保幂等的key',unique key uq_idempotent_key (idempotent_key)
) comment '幂等辅助表';

重点关注第二个字段idempotent_key,这个字段添加了唯一约束,说明同时向这个表中插入同样值的idempotent_key,则只有一条记录会执行成功,其他的请求会报异常,而失败,让事务回滚。

String rechargeId = "充值订单id";// 根据rechargeId去找充值记录,如果已处理过,则直接返回成功
RechargePO rechargePo = select * from t_recharge where id = #{rechargeId};// 充值记录已处理过,直接返回成功
if(rechargePo.status==1){return "SUCCESS";
}// 生成idempotentKey,这里可以使用,业务id:业务类型,那么我们这里可以使用rechargeId+":"+"RECHARGE_CALLBACK"
String idempotentKey = rechargeId+":"+"RECHARGE_CALLBACK";// 幂等表是否存在记录,如果存在说明处理过,直接返回成功
IdempotentPO idempotentPO = select * from t_idempotent where idempotent_key = #{idempotentKey};
if(idempotentPO!=null){return "SUCCESS";
}开启Spring事务(这里千万不要漏掉,一定要有事务)// count表示影响行数,这个sql比较特别,看起来并发会出现问题,实际上配合唯一约束辅助表,就不会有问题了
int count = update t_recharge set status = 1 where id = #{rechargeId};// count != 1,表示未成功
if(count!=1){// 走到这里,直接抛出异常,让事务回滚throw new RuntimeException("系统繁忙,请重试")
}else{//给账户加钱update t_account set balance = balance + #{rechargePo.price} where id = #{rechargePo.accountId}
}String idempotentId = "";
// 这里是关键一步,向 t_recharge 插入记录,如果有并发过来,只会有一个成功,其他的会报异常导致事务回滚,上面的
insert into t_recharge (id, idempotent_key) values (#{idempotentId}, #{idempotentKey});提交spring事务
http://www.hyszgw.com/news/59724.html

相关文章:

  • 安徽网站建设详细策划怎么自己在百度上做网站
  • 安徽省住房城乡建设厅门户网站网络服务列表中选择iphone
  • 四川做网站设计的公司做网站需要哪方面的编程
  • 昆明建网站的公司wordpress安装对搜索
  • 做特卖网站有什么网站免费简历制作网站推荐
  • 舟山企业网站建设做公号模版网站
  • 做网站信科网站建设九江市住房和城乡建设厅网站
  • 酒店做爰视频网站如何建设一个稳定的网站
  • 保定网站建设wordpress 安卓手机写
  • 上海建站费用做二手车网站需要什么
  • 如何分析一个网站中国空间站最新进展
  • 可以做国外购物的网站wordpress move zip
  • 网站建设出现乱码是怎么回事兼职做猎头的网站
  • 中山网站建设如何小程序ui设计模板
  • 门户网站申请凡科建站怎么导出网页
  • 网站界面设计要求网站推广无锡
  • 博物馆网站做的最好的辽宁大连最新消息今天
  • 兖矿东华建设网站怎么查域名备案信息
  • 国内十大网站排名简单的旅游网站怎么做
  • 网站建设项目收费标准wordpress windows
  • 怎样优化排名自己网站多个域名指向同一个网站
  • 作词做曲网站刚刚
  • 浙江省网站备案时间子网站建设的好处
  • 淘宝店有给网站做优化am在线免费视频网站推广
  • 门户网站开发 系统介绍移动互联网开发应聘
  • 软件工程主修课程网站图片太多怎么优化
  • 电子商务网站建设与维护总结济南网站建设咨 询小七
  • 新网站如何让百度收录建设电影网站选服务器怎么选
  • 微信网站域名备案成功后怎么做中细软网站建设
  • 廉洁长沙网站重庆做网站建设公司排名