V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xalilo
V2EX  ›  Java

单据状态修改问题

  •  
  •   xalilo · 2019-08-21 20:27:28 +08:00 · 2115 次点击
    这是一个创建于 828 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    limuyan44
        1
    limuyan44   2019-08-21 20:47:37 +08:00
    状态机?
    maowu
        2
    maowu   2019-08-21 21:03:07 +08:00 via Android
    你可能需要的是有限状态机🤔
    xalilo
        3
    xalilo   2019-08-21 21:09:22 +08:00
    @limuyan44 就是一个业务单,状态 state 分为新建,执行,检查,结束这样。
    xalilo
        4
    xalilo   2019-08-21 21:10:33 +08:00
    @limuyan44 我去看看
    SmallDream1995
        5
    SmallDream1995   2019-08-22 10:07:50 +08:00
    马克一下。。。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2294 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:46 · PVG 15:46 · LAX 23:46 · JFK 02:46
    ♥ Do have faith in what you're doing.