1572662

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

开票申请通过rocketmq进行异步消费,申请作废通过http同步调用接口进行作废,若开票申请单已存在,则进行作废时
可对申请单进行作废逻辑处理;若申请单不存在,则调用作废接口时,需要将作废消息保存到数据库表中,待消费申请
消息时,查询表中是否存在作废请求,若存在,则进行作废处理;总而言之就是如果存在作废请求,最终申请单需要是
作废状态。但是现在由于并发问题,可能存在开票申请和作废申请同时进行的情况,因此需要利用redis加分布式锁,
为了保证锁的粒度较小,申请接口的锁加在了查询作废表以及向申请单表中中插入数据这块,这就导致了一个问题,
就是申请单接口加锁,查询作废表中不存在数据,因此直接向申请单表中插入数据,插入之后释放锁,此时作废接口库
获得分布式锁,理论上应该对申请单进行作废,但是由于申请单接口还存在操作其他表的操作,导致事物没有提交,
这就涉及到mysql的隔离级别了,mysql采用的隔离级别是可重复读,因此,由于事物没有提交,作废接口并不能查询到
申请单表要插入的申请单数据,因此也无法进行作废处理,只是将作废申请保存到表中,
因此就出现了最终表中既保存了未作废的申请单,作废表中又保存了作废数据,这样的结果不是我们要的结果,
我们希望得到的结果是作废表中无需保存作废申请数据,申请单表中保存的是作废的申请单。

posted on 2020-09-10 15:21  1572662  阅读(114)  评论(0)    收藏  举报