关于状态变迁一致性接口高性能设计

来源:互联网 发布:爱普生打印机清零软件 编辑:程序博客网 时间:2024/05/16 08:36





这个是订单的流转图,,,,

为了让开发不需要知道流转的细节,为了不需要每个开发都自己实现订单变迁,把订单状态的变迁封装到一个接口当中,接口的参数为 1 orderId, 2 事件枚举对象

(使用事件做为参数是为了  屏蔽开发者对复杂订单流程的了解,减少开发的门槛),而且  该接口必须能够坚持这种事件变迁的合法性。比如   当前订单状态为已支付, 然后传递一个   取消订单的事件,,, 这样是不合法的,因为不符合状态机流转,,,,


接口

public void handlerEvent(Long innerOrderId, DfOrderEvent event);

实现方案1:

初始化.。。

状态-事件-下个状态

状态1-事件1-下个状态1

状态2-事件2-下个状态2

将所有状态变迁加载的内存放map里面

map<String,Integer> 

map key为   state+event,value 为下个状态



1  select state from order where orderid =***

2 将当前状态跟事件  跟状态机map做比对,,如果找不到下个状态,,说明不合法,,,返回

3 update   set state = finalSate where orderid= and state = 


但是在case 3 可能出现冲突,,,,

因为在执行3的时候,可能状态被改了,,,这个时候跟新记录数为0 ,这个时候怎么办???

比如 新单- 》已取消   新单->已接单  并发出现的时候,就会出现碰撞。


这个时候,如果更新记录数为0,就select state 返回,,,告诉调用者,,,状态已经被改成另个状态了,,,,事件执行失败






0 0
原创粉丝点击