wf的事务控制
1.关于事务
wf中的transaction Scope是使用transaction Scope这个Activity实现的,在lab08描述了一个银行转帐的场景。
帐务表A减少100元,帐务表B增加100元,做为一个完整的事务,要么完全实现要么完全回退。不过如果我碰到这种应用场景,估计不会这样做。我的理解是transaction Scope Activity是建立再MTS上的分布式事务,如果是同一个数据库内部实现用数据库的事务控制会有性能优势,而且这样的场景如果有复用的需求,我会放到一个Activity中实现。不过这里只是演示,没有必要较真。许多事务控制还是需要transaction Scope Activity的,比如常见的接口程序里面,流程一般都是数据入库,进行逻辑处理或者逻辑校验如果成功可能还需要删除接口文件。这是一个需要事务控制的地方,而且也无法用数据库事务来控制,以前都考虑MTS在工作流中就要用到transaction Scope Activity。
2.如何使用transaction Scope Activity
2.1 从工具箱中脱动transaction Scope Activity到设计界面
2.2 这时候我们看到设计界面上会出现一个transactionScopeActivity的区域,需要放入事务中的Activity都应该脱入其中。
2.3 最后,要脱一个throw Activity进入这个区域,当异常发生时候会运行这个Activity。在这个Activity的属性中要指定Fault
fautl属性定义了抛出的异常,可以是自定义的的Exception.
2.4 view faults在那里不用我说了吧,在这里加入FaultHandle Activity,并指定属性捕获特定异常,看起来很象是ConditionAcitivityGroup。
在这里面放个code Activity写入异常的处理逻辑。
整个的处理过程看起来非常象try catch的逻辑
3.上面的例子没有考虑事务补偿问题,如果事务失败需要补偿的话怎么办
3.1 用CompensatableTransactionScopeActivity代替transaction Scope Activity
3.2 throwActivity这个时候要放到CompensatableTransactionScopeActivity区域外面
3.3 补偿逻辑用Compensate activity实现,在view Fault中加入Compensate activity。