美文网首页
基于乐观锁的幂等处理

基于乐观锁的幂等处理

作者: 会飞的小猪 | 来源:发表于2021-12-09 14:44 被阅读0次

我们在实现幂等接口的时候,例如处理微信支付回调,一般来说可以根据如下逻辑来实现幂等操作。
伪代码

// 根据订单号查询订单是否存在
步骤1、Order order = orderService.getOrder(orderNo);
// 判断状态是否成功
步骤2、if (order!=null && !order.getStatus().equalsIgnoreCase("success")){
步骤3、    // 更新订单成功,以及后续业务逻辑等等
              }

假如同时过来两条请求,请求1和请求2的线程是可以同时走到步骤3的,此时系统会走两遍业务逻辑,对于金融业务来说这是不允许出现的。
那么有没有一种办法,既简单又可以避免这个问题呢。其实我们可以利用乐观锁的思想来实现幂等防并发问题。
控制层

Order order = orderService.getOrder(orderNo);
        if (order!=null && order.getStatus().equalsIgnoreCase("init")){
            order.setStatus("success");
            orderService.updateOrder(order);
        }

mybatis逻辑

update `order`
    set  status = #{status,jdbcType=VARCHAR},version=version+1
    where id = #{id,jdbcType=INTEGER}
    and version=#{version,jdbcType=INTEGER}

下面我们来测试下。

数据库记录 image.png
jmeter模拟100个并发
image.png

执行完数据库记录只更新了一次


image.png
乐观锁:
1.如果有人在你之前更新了,你的更新应当是被拒绝的,可以让用户重新操作。
2.实现:大多数基于数据版本(Version)记录机制实现

具体可通过给表加一个版本号或时间戳字段实现,当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断当前版本信息与第一次取出来的版本值大小,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据,拒绝更新,让用户重新操作。

相关文章

  • 基于乐观锁的幂等处理

    我们在实现幂等接口的时候,例如处理微信支付回调,一般来说可以根据如下逻辑来实现幂等操作。伪代码 假如同时过来两条请...

  • 乐观锁幂等性

    如何避免MySQL死锁: 思路: 1、 因为加锁而导致死锁, 所以放弃使用悲观锁方案, 改为乐观锁方案 2、 如果...

  • mq消费幂等总结

    mq消费幂等总结针对mq新增场景:1、单个新增:1)首先查本地db是否已存在,存在则幂等2)加redis乐观锁,加...

  • 基于状态机的乐观锁 ——解决幂等性问题

    在开发过程中,我们经常面对这种情况: 1、点击一个按钮无反应时,会不停的重复点击,如果前端代码未做...

  • java中的锁(一)

    java 锁 源码看 github java 中的锁,宏观上分为乐观锁和悲观锁乐观锁:读多写少,都是基于CAS实现...

  • 基于redis的分布式锁的分析与实践

    前言:在分布式环境中,我们经常使用锁来进行并发控制,锁可分为乐观锁和悲观锁,基于数据库版本戳的实现是乐观锁,基于r...

  • 并发参数

    悲观锁与乐观锁 悲观锁 synchronized和ReentrantLock等独占锁就是悲观锁思想的实现乐观锁一般...

  • 分布式锁的实现方式

    分布式锁通常有3种实现方式,即数据库乐观锁、基于redis的分布式锁和基于zookeeper的分布式锁。 一、基于...

  • 64_数据建模实战_基于全局锁实现悲观锁并发控制

    64_数据建模实战_基于全局锁实现悲观锁并发控制 1、悲观锁的简要说明 基于version的乐观锁并发控制 在数据...

  • RabbitMQ高级特性--幂等性概念

    幂等性是什么 我们可以借鉴数据库的乐观锁机制,比如执行一条更新库存的SQL.update T_REPS set c...

网友评论

      本文标题:基于乐观锁的幂等处理

      本文链接:https://www.haomeiwen.com/subject/dteffrtx.html