假设一个单据整个流程有 10 个节点状态,每次状态变更时候都可能发生:状态被改成之前的已执行过的状态这种类似错误。为了防止这种问题,每次变更时候要校验当前状态能不能改成指定状态,并且要加锁防止并发。
由于节点状态比较多,那么每个点都要加锁并且校验当前状态是否合法,这很容易遗漏,导致出现状态混乱的问题。
现在想到的办法: 1、增加一个接口,StateChange#change(合法的上游状态,要改的目标状态); pojo 类实现这个接口,实现的时候通过悲观锁 for update 查询,锁住数据,并校验数据库当前状态是不是在合法的上游状态数组里面,符合就是调用 setState()给该单据对象的 state 字段赋值。 2、另外一种实现方法,定义一个 State 接口,每种状态都实现这个接口,然后变更单据状态都通过状态对象来执行,这样就可以在对象里封装锁和校验的逻辑。
想问问大家都是怎么解决这种问题的?
1
limuyan44 2019-08-21 20:47:37 +08:00
状态机?
|
2
maowu 2019-08-21 21:03:07 +08:00 via Android
你可能需要的是有限状态机🤔
|
5
SmallDream1995 2019-08-22 10:07:50 +08:00
马克一下。。。
|