首页 > 其他分享 >对外提供的api保证接口的幂等 (先select 再 update innodb是行级锁, mysam是表级的锁)

对外提供的api保证接口的幂等 (先select 再 update innodb是行级锁, mysam是表级的锁)

时间:2023-05-02 22:25:04浏览次数:41  
标签:行级 hash 请求 mysam 结果 重复 update 接口 产生

额外的状态字段,这个状态值一般只会单流程变更,不管通过什么消息传递,目前申万宏源的每一个业务大部分都走流程,走的过程就有唯一的业务字段配合

工作流workflow服务来进行业务流转

个人观点解决幂等只有两种方式
第一种依赖上游带过来的唯一标志,然后我们给这个唯一标志加锁保证请求只有一个请求,别的都直接反回。
第二种,上游啥都不做,下游通过请求参数摘要来控制幂等,hash有冲突,为了降低hash冲突的概率,出了hash 碰撞以后,可以在检查 方法名字,请求参数大小。来降低偶然的可能。如果按照上游唯一标志产生方式不同,都算是不同幂等性的解决方案,我觉得我可以写出1万种幂等解决方案。

 

在实际项目中有很多操作,不管是做多少次,都应该产生一样的效果或返回一样的结果

前端重复提交选中的数据,后台应该只产生对应这个数据的一个反应结果
我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统 bug 重发,也应该只扣一次钱
发送消息,也应该只发一次,同样的短信发给用户,用户会哭的
创建业务订单,一次业务请求只能创建一个,创建多个就会出大问题等等很多重要的情况都需要幂等的特性来支持
接口幂等性概念
接口幂等性:是指用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用或不同的结果。简言之,幂等性就是一个操作,不论执行多少次,产生的效果和返回的结果都是一样的

防重复和幂等,其实是有区别的

防重复主要为了避免产生重复数据,对接口返回没有太多要求
幂等除了避免产生重复数据之外,还要求每次请求都返回一样的结果

 

 

 

 

标签:行级,hash,请求,mysam,结果,重复,update,接口,产生
From: https://www.cnblogs.com/ZhangZiXue/p/17368411.html

相关文章

  • bat禁用win update
    @echooffnetstopwuauservscconfigwuauservstart=disabledscprivwuauservrecovery=Disableschtasks/Change/TN"\Microsoft\Windows\WindowsUpdate\sih"/DISABLEschtasks/Change/TN"\Microsoft\Windows\WindowsUpdate\ScheduledS......
  • [FireDAC][Phys]-330. Cannot generate update query. Update table undefined.
    在正式的查询SQL前,用了临时表存储查询条件,数据正常加载,结果编辑、保存时报错了代码是老早前写,现在看,其实完全可以直接用存储过程的结果,也不用中间再转一次,这个异常也就可以避过去了 ......
  • 错误until the update interval of nexus-releases has elapsed or updates are force
    错误:untiltheupdateintervalofnexus-releaseshaselapsedorupdatesareforced  (从文件系统里传的,而不是从nexues界面上传的),有些文件nexues从中央仓库里下载不到,本人从别处拷贝一个上传去后,执行mvncompile时出现该错误。  解决办法:mvncleaninstall-U -Umeansfor......
  • update(修改数据)
    语法格式:update表set value1=值1,value2=值2 where 条件注意:1、字段之间使用逗号隔开  2、修改的值,看类型加引号举例一:修改一个字段把老王的age改成100修改前......
  • PB开发境界 多个DW进行update
    多个DW进行update//菜鸟代码dw_1.Update()dw_2.Update()初级代码IFdw_1.Update()=1Anddw_2.Update()=1THEN    COMMIT;ELSE    ROLLBACK;ENDIF中级代码IFdw_1.Update()=1THEN    IFdw_2.Update()=1THEN        COMMIT;......
  • CentOS7再次探讨修改系统的启动模式(运行级别)
    1.查看当前运行级别:systemctlget-default或者runlevel或者who-r2.查看文件夹/lib/systemd/system/ll/lib/systemd/system|grepmulti-user.target ll/lib/systemd/system|grepgraphical.target ll/lib/systemd/system/default.target可以看到当前默认的runle......
  • SQL Inject漏洞手工测试:基于报错的信息获取(select/delete/update/insert)
    技巧思路:在MYSQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息。select/insert/update/delete都可以使用报错来获取信息。背景条件:后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端。重点:基于报错的信息获取------三个常用的用来报错的函数updatexml()......
  • update by query
    类似于mysql中的updatesetwhere核心jsonVM,POD类型的数据,并且host.network.bytes.outgoing字段不为null,并且时间窗口范围在。。。到。。。之间的数据修改其中host.network.bytes.outgoing字段的值为nullPOSTdelta-monitor-2023.04.24/_update_by_query{"script":{......
  • Mysql - Gorm Updates的坑
    //如果单个属性被更改了,更新它db.Model(&user).Update("name","hello")////UPDATEusersSETname='hello',updated_at='2013-11-1721:34:10'WHEREid=111;//使用组合条件更新单个属性db.Model(&user).Where("active=?",true).U......
  • mysql select for update + 事务处理数据一致性
    如果SELECT后面若要UPDATE同一个表数据的相关操作,最好使用SELECT...FORUPDATE。一:举例说明假设商品表单test_leyangjun 内有一个存放商品库存的num字段,一个id主键 ,在生成订单前须先确定num>0 ,然后才把数量更新。代码如下(比如现在的库存:num=3对应的id=3,现在生成一个订单......