如何实现一个状态机?
状态机有很多的应用场景,表征的是一个事物的生命周期或者状态变迁。
如何实现一个状态机呢?
乐观锁
第一种方法是使用乐观锁,只有当原始状态符合我们的预期时才更新为下一个状态。
public void stateTransfer1(Long id, String prevStatus, String status) {
fooDAO.updateStatusTo(id, prevStatus, status);
}
悲观锁
另一种方式是,先对行加锁,然后在应用层的一个事务里判断记录目前的状态是否可以转换为下一个状态,这里一个好的实际是用一个Map维护状态转移之间的映射关系,方便维护。
private static final Map> PREV_STATUS = new HashMap<>();
static {
PREV_STATUS.put("SUCCESS", Arrays.asList("AAA", "BBB"));
PREV_STATUS.put("FAIL", Arrays.asList("CCC"));
}
public void stateTransfer2(Long id, String status) {
// do in transaction
Foo foo1 = fooDAO.lockById(id);
if (PREV_STATUS.get(status).contains(foo1.getStatus())) {
fooDAO.updateStatus(id, status);
}
}