xalilo
V2EX  ›  Java

单据状态修改问题

  •  
  •   xalilo · Aug 21, 2019 · 3576 views
    This topic created in 2456 days ago, the information mentioned may be changed or developed.

    假设一个单据整个流程有 10 个节点状态,每次状态变更时候都可能发生:状态被改成之前的已执行过的状态这种类似错误。为了防止这种问题,每次变更时候要校验当前状态能不能改成指定状态,并且要加锁防止并发。

    由于节点状态比较多,那么每个点都要加锁并且校验当前状态是否合法,这很容易遗漏,导致出现状态混乱的问题。

    现在想到的办法: 1、增加一个接口,StateChange#change(合法的上游状态,要改的目标状态); pojo 类实现这个接口,实现的时候通过悲观锁 for update 查询,锁住数据,并校验数据库当前状态是不是在合法的上游状态数组里面,符合就是调用 setState()给该单据对象的 state 字段赋值。 2、另外一种实现方法,定义一个 State 接口,每种状态都实现这个接口,然后变更单据状态都通过状态对象来执行,这样就可以在对象里封装锁和校验的逻辑。

    想问问大家都是怎么解决这种问题的?

    limuyan44
        1
    limuyan44  
       Aug 21, 2019
    状态机?
    maowu
        2
    maowu  
       Aug 21, 2019 via Android
    你可能需要的是有限状态机🤔
    xalilo
        3
    xalilo  
    OP
       Aug 21, 2019
    @limuyan44 就是一个业务单,状态 state 分为新建,执行,检查,结束这样。
    xalilo
        4
    xalilo  
    OP
       Aug 21, 2019
    @limuyan44 我去看看
    SmallDream1995
        5
    SmallDream1995  
       Aug 22, 2019
    马克一下。。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3036 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 15:11 · PVG 23:11 · LAX 08:11 · JFK 11:11
    ♥ Do have faith in what you're doing.