我想了一下转账这个问题,能不能这样考虑:
将转账这个事务看作一次运动,这是一次代表钱的数字从user1运动到user2的运动。我们可以将这次运动用如下形式标识:
public class MoneyTransfer {
public Guid Id {get; private set;}
public Guid FromAccountID {get; private set;}
public Guid ToAccountID {get; private set;}
public decimal MoneyValue {get; private set;}
}
然后这个运动的完成过程由于被我们分成了两个并行的步骤——FromAccountID的减钱和ToAccountID账户的加钱。于是MoneyTransfer中不得不加入跟踪这两个步骤完成情况的状态字段,变成下面这个样子:
public class MoneyTransferActor {
private Guid Id {get; set;}
private Guid FromAccountID {get; set;}
private Guid ToAccountID {get; set;}
private decimal MoneyValue {get; set;}
private bool[] dones{get;set;}
private IActor[] ChildActors{get;set;}
}
MoneyTransferActor中有两个ChildActor,一个负责user1的减钱一个负责user2的加钱。MoneyTransferActor负责监管整个转账事务,它的两个子actor必须都成功,如果其中一个成功了而另一个失败了则MoneyTransferActor负责通知成功的那个子actor回退。
事务完成后MoneyTransferActor的状态持久化起来即是完整的日志,完整的可以原路返回。