如何保证幂等

1.悲观锁 可以使用 ReetrantLock 类、synchronized 关键字这类 JDK 自带的悲观锁来保证同一时刻只有一个线程能够进行修改。不过,JDK 自带的锁属于是本地锁,分布式环境下无法使用。

在 MySQL 里使用排他锁: 如果一个记录已经被加了排他锁,那其他事务不能再对这条事务加任何类型的锁(锁不兼容)。

乐观锁:乐观锁一般会使用版本号机制或 CAS 算法实现。

拿版本号机制来说,通过在表中增加一个版本号字段,每次更新数据时,检查当前的版本号否和数据库中的一致。如果一致,则更新成功,并且版本号加一。如果不一致,则更新失败,表示数据已经被其他请求修改过。

唯一索引:通过在表中加上唯一索引,保证数据的唯一性。如果有重复的数据插入,会抛出异常,程序可以捕获异常并处理。不过,这种方法只适用于插入数据的场景。

分布式锁:

Token机制:

  1. 请求获取服务器端 token,token 需要设置有效时间(可以设置短一点),服务端将该 token 保存起来(通常保存在缓存中)。
  2. 执行真正的请求,将上一步获取到的 token 放到 header 或者作为请求参数。服务端验证 token 的有效性,如果有效(一般是通过删除 token 的方式来验证,删除成功则有效),执行业务逻辑,并删除 token,防止重复提交;如果无效,拒绝请求,返回提示信息。

如何保证幂等_第1张图片

你可能感兴趣的:(spring,java,spring,boot)