Java后端实战案例解决方案讨论

YaHello 2026-06-08 15:45 1

背景:ERP系统中给一条合同创建回款单,回款单创建完成后更新合同的已收/未收金额字段。

业务:在审批场景下,可以给一条合同创建多条审批中的回款单(审批通过后才生效),为保证系统运行速度,用户点击审批同意后,主线程会去判断合同的未收金额是否足够,足够才能继续向下执行。但是审批会涉及到复杂的节点流转业务,所以更新合同已收/未收金额操作要通过MQ异步执行,从而提高响应速度。

问题:如果用户非常快的给同一合同的两条回款单点击同意,后同意的回款单很容易在主线程拿到先同意的回款单异步逻辑执行完成前的合同已收/未收金额,从而导致合同已收金额开超。

问了AI给出的方案不太符合现有需求,欢迎各位大佬理性讨论,各抒己见。(ps:前提一定要保证使用MQ更新合同金额)

最新回复 (7)
  • 莫泠然 06-08 15:52
    1

    试一下 redisson 锁?发 MQ 的时候上锁,消费的时候解锁。

  • ianAqkj 06-08 15:54
    2

    感觉有点像超卖问题?MQ消费update的时候+判断?

  • Romic 06-08 16:01
    3

    根本原因是并发问题,导致处理了多次。

    有小伙伴说直接使用redisson 锁,加锁 排队进入,不会超卖。

    是否会存在风险,能否解决所有场景?答案是99%的场景能解决,不能解决 redis fork rdb hang住。,还是会导致多条。

    怎么解决 我自不必多说。 我相信你不会关闭redis的rdb。

  • YaHello 楼主 06-08 16:12
    4

    我一开始想这么做,但是组长说不太好,谁加锁谁解锁更合理一些。而且我问了AI主线程加锁,异步线程释放锁技术上也是无法实现的,如果线程Id不一致,异步线程释放锁的时候会抛异常

  • YaHello 楼主 06-08 16:14
    5

    主线程在发送完MQ之后,直接返回“审批完成”了,用户也会看到审批成功的页面。异步线程就算再进行校验,也无法将校验结果返回给主线程了

  • YaHello 楼主 06-08 16:17
    6

    没懂捏,rdb不是做快照的吗 ^-^

  • 1024 06-08 16:29
    7

    加锁–>查询redis合同未收金额–无–> 查询数据库合同未收金额 → 判断合同的未收金额是否足够 → 更新redis合同未收金额 → 解锁 -->MQ发送消息

* 帖子来源Linux.do
返回