• Redis锁异步线程中使用问题


    1.出现的问题:

    订单中心查询时,出现重复数据,如下图:

    出现上图结果的原因在于,该订单记录存在两条评价记录。

    根据现有的业务需求,一个图文咨询订单应该只会存在一条有效的评价记录,但此处可以看到orderId为2021011400000082的订单出现了两条评价记录。

    2.定位问题出现的原因:

    (1)新增评价记录方法代码截图

    上图中可以看到此处使用redis锁,并且在锁中有判断是否已存在记录,已存在这直接return,不会创建新的记录。

    1.医生结束方法和系统自动结束方法都会调用新增待评价记录方法;

    2.在系统结束时会异步抛出系统结束事件,该事件内判断当无待处理处方时,会自动调用医生结束方法(模拟医生结束)。

    下图1-3为系统结束、系统结束事件及医生结束代码截图:



    (图1)系统自动结束方法


    (图2)系统自动结束事件实现



    (图3)医生结束方法




    评价表设计如图4,其中orderId为评价对象的唯一主键。


    (图4)用户评价对象



    下图5为新增评价记录方法,使用Redis锁,锁了一个自定义键值,然后使用sql查询进行判断评价记录是否存在,存在则return。在同一个事务中,该逻辑没有问题,能够有效避免对一个orderId重复创建评价记录的情况,但是当两个不同的事务的同时触发了该方法对一个同一个orderId创建评价记录时,未能命中缓存索引,此时的锁就没有起到作用了。

  • 相关阅读:
    IDEA Inspections详解
    IDEA 阿里编码规范插件
    IDEA Save Actions插件
    IDEA Lombok插件
    设计模式-简单工厂模式与工厂模式
    DAO设计模式
    Jcrop+strut2+jsp实现图片剪切
    Spring的Bean的作用域
    Spring的事务机制
    windows 下 Redis 主从 读写分离
  • 原文地址:https://www.cnblogs.com/feathe/p/16013870.html
Copyright © 2020-2023  润新知