事务
.NET Framework 2.0 包括一个轻松而有效处理事务的对象 — 无论参与对象的数目和类型以及范围如何,也无论事务是本地的还是分布式的。该对象被命名为 TransactionScope,一般情况下,您可以根据如下模式进行使用:
Using ts As New TransactionScope
...
ts.Complete
End Using
TransactionScope 对象保证在出现故障的情况下,事务既可以被提交也可以被回滚,更为重要的是,它可以确定您需要一个本地事务还是一个分布式事务,并登记所有必要的资源。当代码到达一个无法本地运行的点时,相应地,TransactionScope 提升至分布式事务处理协调器 (DTC)。实施 ITransaction 接口的所有对象可以随一个事务一起登记。该列表包括所有标准 ADO.NET 2.0 数据提供程序,并且 Microsoft 消息队列以兼容模式工作。
值得注意的是对于分布式事务,TransactionScope 和企业服务之间存在一些差别。TransactionScope 属于专门针对基于 .NET 的应用程序而设计的事务框架 — System.Transactions。在内部,System.Transactions 命名空间的类有时会以为 DTC 和 COM+ 委派一些工作作为结束。为什么在这一点上 TransactionScope 至关重要?TransactionScope Windows Workflow Foundation 活动仅仅是 TransactionScope .NET 类实例的一个工作流包装程序。
当您为工作流添加 TransactionScope 活动时,您可以设置要完成的事务的超时时间,并设置所需的隔离级别。事务范围内组合的所有活动形成了能够实现典型 ACID 架构的工作单位。在所有子活动都成功完成后将提交事务,工作流继续进行到下一步。如果在范围内引发异常,TransactionScope 活动自动回滚。编写事务性工作流并不要求您显式地处理提交和回滚语义 — 如果您要提交事务和引发异常来中止事务,您只需顺其自然。该活动将可以轻松管理其他任何事情。
请注意,您不能嵌套两个或两个以上的 TransactionScope 活动。同样地,您不能使用 Suspend 活动挂起事务内的工作流。然而,您可以通过 Listen 或 EventHandlingScope 活动,将事件处理程序整合到事务中。在这种情况下,工作流主机应当包括持久性服务,否则,如果工作流试图将它的状态保存为空闲状态,会引发异常。 此外,相关的活动,如 CompensatableTransactionScope 还支持补偿。补偿是在有后续业务预期的情况下,从逻辑上撤消已完成的事务的过程。补偿与回滚不同,因为它是一种当工作流中发生违反规则的情况时,取消已成功完成和提交的事务所产生的影响的有效方法。在两个帐户间进行资金划转的事务是一个典型的回滚示例。第一个调用将资金从一个帐户中取出,第二个调用将相同数额的资金划转至另一个帐户。只要数据库支持两阶段提交模型,如果在事务中引发异常,回滚可恢复一致的状态。
设想一下一个订单处理工作流,其中一个事务被用于通过信用卡进行支付。第一步,首先从信用卡中提取资金来支付货款。然后,在交易成功完成后,该货物不能再被销售。如果违反了业务规则,需要按照合适的规定对交易结果进行补偿 — 一般是将资金划入签帐卡。
通过右键单击 CompensatableTransactionScope 活动,您可以切换到事务的“补偿”视图并添加所有补偿事务影响所需的活动。在图 7 中,OrderScope 事务与补偿活动规定相关联,该规定要求在出现业务异常的情况下,应将已提取的资金退回。正如我前面谈到的,工作流中的异常是通过异常处理程序捕获的。对于某一特定异常(如 ProductDiscontinued),您可以调用一个 Compensate 活动,该活动已绑定到其影响作用已被取消的事务活动。一般情况下,Compensate 活动会触发适用于任何可被补偿的活动(即,适用于实施 ICompensatableActivity 接口的活动)的补偿机制。与 CompensatableTransactionScope 一起,CompensatableSequence 也实施了本接口并能够用于非事务性的补偿情况。不过,您也可以编写支持补偿的自定义活动。
本新闻共
6页,当前在第
5页
1 2 3 4 5 6