Johnny with dotnet

WF 学习笔记总结(二)

1, TransactionScope

    1). 如果TransactionScope.AbortInstanceOnTransactionFailure为False,会触发实例的OnunhandleException。

          多个TransactionScope嵌套的时候,如果transactionScope.AbortInstanceOnTransactionFailure不一致,为False的会触发实例的ObunhandeledException。

     2) 如果AbortInstanceOnTransactionFailure为true时,不会触发实例的ObUnhandledException,会直接Aborted,会触发实力的Aborted。

            多个TransactionScope嵌套的时候,如果内部的transactionScope过期时间小于外部TransactionScope,当这些AbortInstanceOnTransactionFailures都为true时,工作流会取消,会触发实例的Aborted。如果AbotInstanceObTransactionFailure不一致,为False会触发ObunhandledException。

    注意: 如果在transactionScope中遇到TerminalWorkflow,将调用Abort方法。

              如果不在transactionScope中遇到TerminalWorkflow,将调用Compled方法,state为fault。 

2,IsolationLevel

      

Unspecified

正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。

Chaos

无法覆盖隔离级别更高的事务中的挂起的更改。

ReadUncommitted

可以进行脏读,意思是说,不发布共享锁,也不接受独占锁。

ReadCommitted

在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。

RepeatableRead

在查询中使用的所有数据上放置锁,以防止其他用户更新这些数据。防止不可重复的读取,但是仍可以有幻像行。

Serializable

 DataSet 上放置范围锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行。

Snapshot

通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。 

 3. 可以自己写具有回滚功能的Activity,主要是调用System.Transactions.Dll中得RuntimeTransactioinHandle类。

 4. CompensableActivity 补偿容器   补偿使用户可以指定对基于身体活动得成功完成后发生的活动的活动而必须纠正行动。

    1). confirmationHandler的自动执行

           当流程完成是会自动调用所有CompensableActivity中的Confirmationhandler 

     2). CompensationHandler的自动执行

           只有为OnUnhandledException指定为UnhandledExceptionAction.Cancel时

            当流程在CompensableActivitity外部产生异常,才会自动调用CompensationHandler. 结果为Cancel

      3).  CancellationHandler的使用

              只有为OnUnhandledException指定为UnhandledExceptionAction.Cancel时

            当流程在CompensableActivitity的Body部分产生异常,才会自动调用CancellationHandler. 结果为Cancel

       4)  CompensableActivity 显示调用

             使用[Confirm]可以显示调用[CompensableActivity]的[ConfirmationHandler]部分
             使用[Compensate]可以显示调用[CompensableActivity]的[CompensationHandler]部分
              要显示调用[CompensableActivity],需要定义一个[ System.Activities.Statements.CompensationToken]型变量,将                    [CompensableActivity]的[Result]绑定到该变量上.再将[Confirm]或[Compensate]的[Target]属性绑定到该变量上即可实现显示调用
              一个[CompensableActivity]只能被调用一次.调用两次以上会出错
              如果[Confirm]调用后,[Compensate]再调用会出错
              如果[Compensate]调用后,[Confirm]再调用会出错
              [Confirm]或[Compensate]调用后,不会再被自动调用

   5). Confirm 的使用

当在流程中用[Confirm]调用其所对应的[CompensableActivity]的[ConfirmationHandler]时,[ConfirmationHandler]中的内容会被立即执行,这与自动调用不同

         6). Compensate 的使用

当在流程中用[Compensate]调用其所对应的[CompensableActivity]的[CompensationHandle]时,[CompensationHandle]中的内容会被立即执行,这与自动调用不同
显示调用[Compensate]时,不需要为 [实例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]

 4.多个/嵌套 CompensableActivity 容器

无异常时
如果有多个[CompensableActivity]或[CompensableActivity]有嵌套时,[ConfirmationHandler]执行顺序是:
在同级别容器中,是从下向上[ConfirmationHandler],在嵌套容器中是从外向内[ConfirmationHandler]

   7. 有异常,但异常不在CompensableActivity中时

如果有多个[CompensableActivity]或[CompensableActivity]有嵌套时,[ConfirmationHandler]与[CompensationHandler]执行顺序是:
1.如果产生异常的[Activity]与[CompensableActivity]在同级别容器中,则该级别的[CompensableActivity]会执行[ConfirmationHandler].
[CompensableActivity]嵌套的[CompensableActivity]会执行[ConfirmationHandler]

 

    8. 异常在CompensableActivity中时
如果有多个[CompensableActivity]或[CompensableActivity]有嵌套时,[ConfirmationHandler][CompensationHandler]与 [CancellationHandler]执行顺序是:
 
1.如果产生异常的[Activity]与[CompensableActivity]在同级别容器中,则该级别的[CompensableActivity]会执行[ConfirmationHandler].
[CompensableActivity]嵌套的[CompensableActivity]会执行[ConfirmationHandler]

2.如果产生异常的[Activity]与[CompensableActivity]具有[父子孙]的直接层级关系,会调用这些具有[父子孙]直接层级关系 [CompensableActivity]的[CancellationHandler] 

 

9.  TerminateWorkflow 不会触发CompensableActivity的任何行为

posted on 2012-10-09 18:58  JohnnyNet  阅读(399)  评论(0编辑  收藏  举报

导航