Redis锁异步线程中使用问题

1.出现的问题:

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

 

 

 

 

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

 

 

 

 

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

 

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

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

 

 

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

 

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

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

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


 

 


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

 

 


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


 

 


(图3)医生结束方法

 

 




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

 

 


(图4)用户评价对象

 



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

posted @ 2022-03-16 18:12  打代码的小超人  阅读(271)  评论(0编辑  收藏  举报