幂等性应用在软件系统中,它简单定义为:某个函数或者某个接口使用相同参数调用一次或者无限次,其造成的后果是一样的,在实际应用中一般针对于接口进行幂等性设计

幂等性一般应用于协议设计,TCP协议支持幂等吗?答案是肯定的,在网络不稳定时,操作系统可以肆无忌惮的重发TCP报文片段。TCP协议能够保证幂等的核心在于sequence number字段,

一个序列号的在较长的一段时间内均不会出现重复。对于应用层的协议设计,原理和TCP是类似的,我们需要一个不重复的序列号。再简单一点说,在一个业务流程的处理中,

我们需要一个不重复的业务流水号,以保证幂等性。

一::token机制,防止页面重复提交

业务要求:

页面的数据只能被点击提交一次

发生原因:

由于重复点击或者网络重发,或者nginx重发等情况会导致数据被重复提交

解决办法:

集群环境:采用token加redis(redis单线程的,处理需要排队)

单JVM环境:采用token加redis或token加jvm内存

处理流程:

1. 数据提交前要向服务的申请token,token放到redis或jvm内存,token有效时间

2. 提交后后台校验token,同时删除token,生成新的token返回

token特点:

要申请,一次有效性,可以限流

注意:redis要用删除操作来判断token,删除成功代表token校验通过,如果用select+delete来校验token,存在并发问题,不建议使用

二.唯一索引,防止新增脏数据

比如:支付宝的资金账户,支付宝也有用户账户,每个用户只能有一个资金账户,怎么防止给用户创建资金账户多个,那么给资金账户表中的用户ID加唯一索引,所以一个用户新增成功一个资金账户记录

三. 悲观锁

获取数据的时候加锁获取

select * from table_xxx where id='xxx' for update;

注意:id字段一定是主键或者唯一索引,不然是锁表,会死人的

悲观锁使用时一般伴随事务一起使用,数据锁定时间可能会很长,根据实际情况选用

四. 乐观锁

乐观锁只是在更新数据那一刻锁表,其他时间不锁表,所以相对于悲观锁,效率更高。

乐观锁的实现方式多种多样可以通过version或者其他状态条件:

通过版本号实现

update table_xxx set name=#name#,version=version+1 where version=#version#

五. 状态机幂等

在设计单据相关的业务,或者是任务相关的业务,肯定会涉及到状态机(状态变更图),就是业务单据上面有个状态,

状态在不同的情况下会发生变更,一般情况下存在有限状态机,这时候,如果状态机已经处于下一个状态,

这时候来了一个上一个状态的变更,理论上是不能够变更的,这样的话,保证了有限状态机的幂等

10. 对外提供接口的api如何保证幂等

如银联提供的付款接口:需要接入商户提交付款请求时附带:source来源,seq序列号

source+seq在数据库里面做唯一索引,防止多次付款,(并发时,只能处理一个请求)

重点:

对外提供接口为了支持幂等调用,接口有两个字段必须传,一个是来源source,一个是来源方序列号seq,

这个两个字段在提供方系统里面做联合唯一索引,这样当第三方调用时,先在本方系统里面查询一下,是否已经处理过,返回相应处理结果;没有处理过,进行相应处理,返回结果。

注意,为了幂等友好,一定要先查询一下,是否处理过该笔业务,不查询直接插入业务系统,会报错,但实际已经处理了。

引用博文 :幂等性实现方案

RocketMq解决消息顺序和重复,Mysql与Java中的乐观锁悲观锁

java幂等的实现方案_java的幂等性相关推荐

  1. java读取图片缩略方法_java 图片缩略图的两种方法

    最近网上看到两种不同的java图片缩略图的绘制方案 第一种,使用Graphics().drawImage按照一定的比例重新绘制图像. Java代码 package com.image.suoluetu ...

  2. 人人都能掌握的Java服务端性能优化方案

    转载自 人人都能掌握的Java服务端性能优化方案 作为一个Java后端开发,我们写出的大部分代码都决定着用户的使用体验.如果我们的代码性能不好,那么用户在访问我们的网站时就要浪费一些时间等待服务器的响 ...

  3. java接口签名(Signature)实现方案续

    一.前言 由于之前写过的一片文章 (java接口签名(Signature)实现方案 )收获了很多好评,此次来说一下另一种简单粗暴的签名方案.相对于之前的签名方案,对body.paramenter.pa ...

  4. 高并发的核心技术-幂等的实现方案

    高并发的核心技术-幂等的实现方案 一.背景   我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果.  例如: 1. 前端重复提交选中的数据,应该后台只产生对应这个数据的一 ...

  5. 来了超火爆的Java游戏羊了个羊_java开发游戏项目

    <羊了个羊>是一款网络上的卡通背景消除闯关游戏,游戏利用各种道具和提示来消除每一个关卡当中的障碍和陷阱. 游戏规则 羊了个羊在游戏下方共有7个槽位,玩家只要把3个相同方块点到槽位中就会消除 ...

  6. Java实现Word转PDF方案选择

    Java实现Word转PDF方案选择 很多应用场景中都会涉及到Word转PDF,但Word转PDF的方案在网上一搜一大把,让人眼花缭乱,笔者踩过无数的坑后,最终总结出以下三种方案 OpenOffice ...

  7. java soap axis,使用SOAP开发java web服务 Axis开发方案

    使用SOAP开发java web服务 Axis开发方案 本文的预定读者首先要对j2ee有所了解,熟悉xml,tomcat等基本内容,本文主要是简单介绍一下web服务的基本内容,怎样在java web开 ...

  8. java幂等_幂等性学习及接口的幂等性

    幂等性学习 一:什么是幂等性 在这里需要有以下几个问题需要注意: 1:幂等性的实质是一次或多次请求同一个资源,其结果是相同的.其关注的是对资源产生的影响(副作用)而不是结果,结果可以不同.比如列表查询 ...

  9. Java rmi 找不到方法_Java RMI使用方式与技巧总结

    RMI介绍 RMI全名Remote Method Invocation,用于java程序远程方法(不存在于本地中的方法)调用.是java实现分布式的实现方案之一.它可以被看作是RPC的Java版本.但 ...

最新文章

  1. 数据结构-图论-拓扑排序模板题(hdu3342)(poj1270)(hdu4857)
  2. 最短JS判断是否为IE6(IE的写法)
  3. python能写软件吗-用什么软件写python
  4. matplotlib 标签_Python可视化matplotlibamp;seborn14热图heatmap
  5. Semaphore 源码分析
  6. allowedExts php,通过php扩展增加一个内置函数
  7. 买断变订阅!苹果第一付费软件被骂上热搜 官方回应
  8. PyTorch 1.0稳定版正式发布,并向开发者提供免费AI课程
  9. javagui点击按钮弹出另一个界面_界面设计如何提高转化率和易用性(10则)
  10. OpenCV图像拼接之Stitching和Stitching_detailed
  11. es6笔记 day1---let和const的应用
  12. Android 代码中的常见的问题总结
  13. MySQL8的新特性ROLE
  14. 450.删除二叉搜索树中的节点
  15. 手动修改VirtrualBox虚拟机的操作系统时间——WinXP为例
  16. python-常见的语法错误
  17. codeforces 999 C. Alphabetic Removals(1200)
  18. UnavailableInvalidChannel: The channel is not accessible or is invalid. channel name: conda-forg ch
  19. 朴素贝叶斯算法实现垃圾邮件过滤(Python3实现)
  20. 网络协议-DNS与Hosts

热门文章

  1. Rxjava 简介链接
  2. 留学推荐信模板 计算机,出国留学推荐信范本(十七):计算机专业
  3. Spring注解@Autowired
  4. autowired java_Spring @Autowired为什么不能与Java泛型一起使用
  5. html颜色代码表odd,CSS的odd和even属性实现table表格tr单双行颜色相间而不同
  6. jquery点击事件失效原因和解决办法
  7. VI/VIM代码格式对齐
  8. Oracle中bitand函数的一次妙用
  9. 659. 分割数组为连续子序列
  10. 华为手机4月升级鸿蒙操作系统排名,手机版鸿蒙系统升级计划曝光,华为Mate 40首当其冲,按芯片排名...