“使用 WorkflowCommitWorkBatch 服务”示例

Download sample

此示例演示 Windows Workflow Foundation 如何使自定义服务能够参与到与使用了服务的工作流实例相同的事务中。

具有与其关联的事务行为的任何复合活动也具有与其关联的工作批次。 如果包含在此复合活动中的任何活动对宿主提供的服务调用某个方法,该服务也可能是工作批次的一部分。 复合活动完成时,将提交工作批次。 如果任何项出于某种原因未能提交,则整个工作批次将回滚。 在提交过程中,将向批次中的所有项提供事务上下文。 因此,想要参与事务的服务也会获取事务上下文。 然后,它可以将该事务上下文一直传递到它进行的任何调用。 例如,最常见的情形是将事务上下文传递到数据库调用,这样,即使是数据库调用也可参与到同一事务中。

参与工作批次

若要参与工作批次,服务必须实现一个名为 IPendingWork 的接口。

向工作批次注册

若要参与工作批次,服务(或必须参与工作批次的任何类型)必须向工作批次注册。 以下方案介绍向工作批次注册所必需执行的步骤。

在执行过程中,活动将对服务调用一个方法。 该方法只是向工作批次和完成工作所必需的上下文注册,而不是执行方法中的实际工作。 稍后,在要提交工作批次时,将会用在注册时使用的上下文调用 Commit 方法。 换句话说,该方法只是延迟处理过程,直至它适合执行实际工作为止。

为了向工作批次注册,将使用以下方法将工作项添加到当前工作批次中:

WorkflowEnvironment.WorkBatch.Add(IPendingWork work, object workItem);

示例详细信息

此示例是一个金额转帐方案。 必须将特定金额的款项从储蓄帐户转帐到支票帐户。 工作流首先在支票帐户中记入该款项的贷项。 然后,它尝试从储蓄帐户中借记该款项。 如果储蓄帐户中的款项金额少于要转帐的金额,则事务将中止并还原支票帐户。 如果该金额大于要转帐的金额,则事务将成功。

作为提交方法的一部分,事务上下文将被传递到数据库调用,这样,即使是数据库也可参与到同一事务中。

此示例有三个自定义活动。

CreditAmount — 用于金额记入支票帐户中的贷项。

DebitAmount — 用于从储蓄帐户中借记金额。

TransactionComposite — 从 SequenceActivity 活动继承的一项复合活动。 它提供了事务行为。

创建和配置 SQL Server 数据库

  1. 在 Microsoft SQL Server 2005 Express、SQL Server 2000 或更高版本或 SQL Server 2000 Desktop Engine (MSDE) 中,使用如下 SQL 查询语句创建名为 SqlPersistenceService 的新数据库:

    CREATE DATABASE SqlPersistenceService

    注意:在工作流应用程序中同时使用 SqlTrackingServiceSqlWorkflowPersistenceService 时,建议对持久性服务和跟踪服务使用单一数据库。

  2. 在 SQL 查询分析器工作区中,从可用数据库列表中选择在步骤 1 中创建的数据库。

  3. 在**“文件”菜单上,单击“打开”**并打开 SQL 脚本 %WINDIR%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\<语言>\SqlPersistenceService_Schema.sql,其中 <framework_version> 是计算机上所安装 .NET Framework 的当前版本。

  4. 通过单击**“执行”**来执行查询,或按 F5 创建 SQL 持久性服务表。

  5. 在**“文件”菜单上,单击“打开”**并打开 SQL 脚本 %WINDIR%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\<语言>\SqlPersistenceService_Logic.sql,其中 <framework_version> 是计算机上所安装 .NET Framework 的当前版本。

  6. 通过单击**“执行”**来执行查询,或按 F5 创建 SQL 持久性服务存储过程。

生成并运行此示例

  1. 通过单击**“下载示例”**来下载该示例。

    这会将示例项目提取到本地硬盘。

  2. 通过运行 .\SQL\TransactionServiceDB.cmd 文件中提供的数据库脚本,创建 TransactionServiceSampleDB 数据库。

    提示

    此脚本创建名为 TransactionServiceSampleDB 的数据库。 示例中使用的连接字符串使用此数据库名称。

    提示

    如果更改数据库的名称,确保要更新源代码中的正确连接字符串。 否则,示例将无法连接到数据库。 同时,在运行脚本之前,请验证是否在脚本的第 20 行中指定了 SQL Server 安装的正确位置。

  3. 单击**“开始”,依次指向“程序”“Microsoft Windows SDK”,然后单击“CMD 外壳”[CMD Shell]**。

  4. 转到示例的源目录。

  5. 在命令提示符处键入 MSBUILD <解决方案文件名>

  6. 在 SDK 命令提示中,运行 Host\bin\debug 文件夹(对于该示例的 VB 版本为 Host\bin 文件夹)中的 .exe 文件,该文件夹位于该示例的源文件夹下。

  7. 若要调试示例,请通过在解决方案资源管理器中右击项目并选择**“设为启动项目”**,将 SampleWorkflow 项目设为启动项目。

  8. 打开 SampleWorkflow 项目的**“属性”**对话框。

  9. 选择**“启动外部程序”**,并选择 Host\bin\Debug 文件夹中的 host.exe 文件。

    在执行 Host.exe 文件时,示例需要您输入要从储蓄帐户转入支票帐户的金额。 输入一个非零正金额。 取决于储蓄帐户中的余额,事务将成功或失败。 您将在屏幕上看到相应的显示。

请参见

参考

Commit
Add
WorkflowCommitWorkBatchService

其他资源

Windows Workflow CommitWorkBatch Services
Using Transactions in Workflows

Footer image

版权所有 (C) 2007 Microsoft Corporation。保留所有权利。