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

上海网站建设服务教做软件的网站

上海网站建设服务,教做软件的网站,网站建设网站建设,php网站建设入门教程啥是幂等#xff1f; 客户端对同一API的多次调用应该产生相同的服务器状态。 通俗的说#xff1a;某个行为重复的执行#xff0c;最终获取的结果是相同的#xff0c;不会因为重复执行对系统造成变化。 比如说同步数据的功能#xff0c;重复可以重复同步#xff0c;如果…啥是幂等 客户端对同一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.status1){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.status1){return SUCCESS; }开启Spring事务// 期望的版本号 Long exceptVersion rechargePo.version;// 下面这个sql是重点重点在set后面要有version version 1where后面要加 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.status1){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.tj-hxxt.cn/news/142350.html

相关文章:

  • 整站优化系统厂家专业做物流公司网站
  • 长春网站设计团队网站设计下载
  • 做神马网站七台河北京网站建设
  • 广东专业网站定制wordpress插件搬家
  • 自己的网站怎么建立汕头网站建设工作
  • 加强网站政务服务建设方案做网站是怎么挣钱的
  • 个人静态网页制作爱站工具seo综合查询
  • pc网站和手机网站怎样做直播网站
  • 做网站傻瓜软件做网站竞争大吗
  • 网站建设合同报价单 模板下载电脑上做简单的网站
  • 网站开发到发布掌握cms建设网站实训报告
  • 如何做好网站内链代码做网站常用单词
  • 江阴做网站的如何制作个人作品网站
  • 企业网站流程图网站建设流程详解
  • 网站设计模板源码做网站开发要多久
  • 网站什么也没动怎么不收录啦如何做情趣网站
  • 网站制作运营公司商城网站建设哪家最好
  • 网站设计广州河池seo快速排名
  • 建设企业网站需要什么wordpress建站流程
  • 大连做网站哪家公司好中山建网站公司
  • 如何建一个自己的网站dedecms 倒计时 天数 网站首页
  • 滨州做网站的科技公司网站随机代码
  • 做网站找个人深圳企业登记注册
  • 海南省城乡建设部网站首页网站建设和网站推广可以同一家做吗
  • 目前哪些企业需要做网站建设的呢WordPress设置用户访问个数
  • 虚拟主机网站建设实训总结大连网站建设企业
  • 如何做搞笑原创视频网站c2c网站内容及功能开始
  • 网站正在建设中的网页怎么做不用fash做的视频网站
  • 营销型网站建设是什么网站邮件系统建设招标
  • 国内f型网页布局的网站动画视频制作软件app