使用 IBM BPM Advanced Integration Service 开发分布式 WS-AT 事务,第 1 部分: 数据库介绍和设置

本文章系列介绍了如何利用 IBM® Business Process Manager V8.0.1 Advanced 中的 Advanced Integration Services (AIS) 功能实现一个分布式 Web Services Atomic Transaction (WS-AT) 场景,该场景涉及两个不同的数据库(Microsoft® SQL Server 和 IBM DB2®),它们安装在两个不同的机器上,可通过两个 Web 服务对它们进行访问:一个使用 .NET 实现,另一个使用 JEE 实现。该实现演示了 AIS 中基于 SCA 的管理与 WS-AT 协议协同提供的自动回滚功能。

Carlo Randone, 认证 IT 架构师 , IBM

Carlo Randone 的照片Carlo Randone 是位于意大利的 IBM 全球企业咨询服务部的一名 IBM 认证 IT 架构师和 Open Group Master 认证 IT 架构师。Carlo 拥有在异构环境和操作系统上使用不同开发平台和中间件的丰富知识。作为一位经过认证的培训师和软件开发人员,他曾为一家 Microsoft® 认证的合作伙伴工作多年。

自 2000 年加入 IBM 以来,Carlo 的主要工作兴趣涉及 SOA 和 BPM、与它们相关的软件工程方法和支持平台,以及企业架构规划和设计。他喜欢收集与 IT 的历史发展相关的文档和硬件零部件,而且为了支持这一爱好,他成为了 Charles Babbage Institute 的一员。



Marco Antonioni, 认证 IT 架构师, IBM

Marco Antonioni 的照片Marco Antonioni 是位于意大利的 IBM 全球企业咨询服务部的一位经过认证的 IT 架构师和 Open Group Master 认证的 IT 架构师。Marco 拥有各种 WebSphere 平台(WebSphere Application Server、WebSphere Process Server、IBM Business Process Manager、IBM Operational Decision Manager、IBM Business Monitor、WebSphere Service Registry and Repository 和 WebSphere Message Broker)方面的深厚知识。自 2000 年加入 IBM 以来,他担任的主要职位是 IBM WebSphere 软件服务部的 BPM 解决方案架构师。



2013 年 8 月 28 日

简介

依据 IBM developerWorks 文章 使用 IBM Business Process Manager Advanced 的好处,IBM Business Process Manager Standard 对该处理环境的态度非常乐观,因此未提供大量现成的功能来解决发生的数据库事务问题。不过,幸运的是,这些类型的高级功能已在 IBM Business Process Manager Advanced(简称 IBM BPM)环境中得到解决,该环境提供了许多连接功能,采用了一种更加悲观的态度对 IBM Business Process Manager Standard 的更加乐观的态度提供补充。本系列文章将展示 IBM BPM Advanced 如何利用一个 Advanced Integration Services (AIS) 实现,使用两种 Web 服务和 Web Services Atomic Transaction (WS-AT) 协议来管理两个不同数据库引擎(Microsoft SQL Server 和 IBM DB2)之间的 ACID 全局分布式事务。该实现还展示了 BPM 中基于 SCA 的实现的自动提交和回滚功能,这些功能利用了 WS-AT。通过配置事务中涉及的 Web 服务(在本例中为 Charge 和 Credit Web 服务)的接口,可以实现这种管理类型,无需执行任何特殊的自定义代码实现。

本系列文章中提供的事务场景类似于 developerWorks 4 部分系列 使用 IBM Business Process Manager 开发事务 Advanced Integration Service 中提供的场景,但在这个新场景中,这两个数据库未使用 BPEL 微流(microflow)中的 Java™ 组件直接访问,而是通过两个事务 Web 服务来仲裁数据管理,一个服务使用 .NET 实现来访问 SQL Server,另一个服务使用 Java 实现来访问 DB2。这些 Web 服务由一个企业服务总线 (ESB) 中介模块(在一个全局事务中)调用,该模块被定义为一个 BPM Advanced Integration Service 的实现。

本系列中提供的实现的核心是一个事务 AIS。AIS 用于从一个 BPM 业务流程定义 (BPD) 调用一个在 IBM Integration Designer 中实现的服务。这种类型的集成模式已在 IBM developerWorks 文章:使用 IBM Business Process Manager Advanced 将业务流程和企业服务链接在一起 中介绍。

Web 服务

Web 服务可用于在一种独立于平台的模式下公开功能和特性。具体来讲,在这里描述的建议场景中,使用了两个(使用不同技术实现的)Web 服务来 “仲裁” 对两个不同数据库的访问。

在与此处所描述的场景类似的场景中,一个团队(例如,精通 Windows 和 .NET 的团队)可开发一个基于 Windows 的 Web 服务来访问 SQL Server 数据库,另一个不同的团队(不一定在同一时间)可开发一个类似的 Web 服务来访问 DB2 数据库,但使用一种类似 JAX-WS 和 WebSphere Application Server 的 JEE 方法。这两个团队可在不同的组织中工作,并使用完全不同的技术平台(正如我们将演示的那样)。

从技术集成开发人员的角度讲,如果选择在 IBM Business Process Manager 中利用 SCA 编程模型的强大功能,那么不仅有机会重用优秀技能,还有机会使用 IBM Integration Designer 设计和开发的强大且可靠的技术 “基础服务”,支持面向业务的服务的总体设计和开发。

请注意,本系列中使用的两个 Web 服务也可由 BPMN 流程在 IBM Process Designer 级别上直接调用(禁用事务策略),但在这种情况下,两个服务(在各自的数据库上)执行的事务不会被视为位于同一个事务上下文中。要将两个服务(和涉及的相关数据库)放在同一个全局事务上下文中,也可将它们实现为 IBM Integration Designer 所实现的基于 SCA 的 Advanced Integration Service 的一部分。具体来讲,在这里描述的场景中,我们的选择是使用一个 ESB 中介模块,但您也可以使用 BPEL 微流(采用一种与以前的文章系列 “使用 IBM Business Process Manager 开发事务 Advanced Integration Service” 中提供的类似的方式)。


系列概述

这个由 5 部分组成的系列文章将介绍以下实现分布式事务场景的主要任务,并提供示例执行案例来演示该场景的功能:

  1. 创建数据库和配置数据源(第 1 部分)
  2. 配置事务支持并实现 2 个事务 Web 服务(第 2 部分)
  3. 在 Process Designer 中定义 BPMN 流程(第 3 部分)
  4. 在 Integration Designer 中,基于一个 SCA 中介 (ESB) 流,调用两个事务 Web 服务来实现 AIS(第 4 部分)
  5. 分析执行案例(第 5 部分)

本文剩余部分将概述该场景,并指导您执行初步设置,以及数据库的创建和配置。


场景实现细节

本文中描述的场景可应用在许多不同的案例和上下文中,但这里描述的实现是在以下产品和版本上执行的:

机器 A(一个名为 ADMINIB-PHG662G 的 Windows 7 计算机),具有以下配置:

  • 操作系统:Microsoft Windows 7 Professional 64 位(带 Service Pack 1)。
  • 数据库:Microsoft SQL Server 2008 Express Edition (X64)(带 Service Pack 3),10.0.5500.0 版。
  • 在 SQL Server 上,一个 Bank1 数据库。
  • .NET Framework 4.0 版本 4.0.30319.1,用作运行时框架
  • Internet 信息服务 (IIS) 7.5,用作 Web 服务器和应用服务器(与 .NET Framework 结合使用)
  • 一个 Charge .NET WCF (Windows Communication Foundation) Web 服务的实现,开发用于管理 Bank1 SQL Server 数据库上的扣费操作。
  • Visual Studio 2010,用作 C# (C-Sharp) 语言中的 .NET Web 服务实现的集成开发环境 (IDE)。

机器 B 是一个名为 IBMBPM 的 Windows Server 2008 服务器,具有以下配置:

  • 操作系统:Microsoft Windows Server 2008 R2 64 位(带 Service Pack 1)
  • 数据库:IBM DB2 9.7 for Windows(DB2 v9.7.400.501、Fix pack 4、构建级别 s110330、IP23238)
  • BPM:IBM Business Process Manager Advanced Version 8.0.1.0
    • IBM WebSphere Application Server Network Deployment 8.0.0.5
    • IBM Integration Designer 8.0.1.1
    • IBM Process Designer 8.0.1.0
  • 在 DB2 Server 上,一个 Bank2 数据库。
  • 一个 Credit JAX-WS Web 服务的实现,用于管理 Bank2 DB2 数据库上的贷入操作。

备注:对于本场景中使用的 BPM 8.0.1 Advanced,应用了截至 2013 年 5 月的最新的修复程序系列。使用的准确的 IBM BPM 版本为 8.0.1000.20121102_2136。

在 Windows 机器 A 上创建的基于 .NET 的 Web 服务将由 Windows Internet 信息服务 (IIS) 托管,在使用该服务之前,您必须先启用它。以下操作说明适用于 Windows 7 机器,但类似的步骤也可在其他 Windows 版本(比如 Vista 或 Windows Server 2008)上执行:

  • 在 Windows 7 机器上,选择 Windows Start => Control Panel
  • 选择 Programs and Features
  • 在左侧窗格中,单击 Turn Windows features on or off
  • Windows features 对话框将会打开。勾选 Internet Information Services
  • 双击 Web Management Tools,然后双击 IIS 6 Management Compatibility,接下来勾选 IIS 6 MetabaseIIS 6 Configuration Compatibility
  • 双击 World Wide Web Services,然后双击 Application Development Features,接下来勾选 ASP.NET
  • 单击 OK

图 1 显示了一个启用了 IIS 的有效配置。

图 1. 启用 Windows IIS
启用 Windows IIS

这里给出的实现的一个有趣方面是受支持的 Web 服务规范的级别。具体来讲,涉及的两个 Web 服务支持 SOAP 1.1 和 WS-AT 1.1 规范。 表 1 列出了这些规范的命名空间。

表 1. 采用的 Web 服务版本和模式
元素此示例中采用的 1.1 版规范
SOAP 1.1 命名空间http://schemas.xmlsoap.org/soap/envelope/
WSDL 中的 SOAP 1.1 绑定 http://schemas.xmlsoap.org/wsdl/soap/
WS-AT 模式 http://docs.oasis-open.org/ws-tx/wsat/2006/06
WS-AT 规范 http://docs.oasis-open.org/ws-tx/wstx-wsat-1.1-spec.pdf

选择为本示例采用这些规范级别,是基于以下理论和实际考虑因素:

  • 最新的 Microsoft .NET 和 IBM WebSphere/IBM BPM 平台都为这些规范级别提供了官方支持。
  • 这些规范的普及和广泛采用。

具体而言,从产品支持的角度讲,IBM BPM V8.0.1 Advanced 支持 SOAP 1.1 和 1.2,以及 WS-AT 1.0、1.1 和 1.2。在 Windows 上,.NET WCF 4 支持 SOAP 1.1 和 1.2,以及 WS-AT 1.0 和 1.1。


场景概述

在与单个数据库管理系统 (DBMS) 交互的简单的 Java 应用程序中,应用程序可使用显式的 SQL 提交和回滚来划分事务边界。一种更加复杂的应用程序环境(包含多个分布在整个网络中的事务资源)需要使用专门的组件来管理协调事务的复杂性。将一个事务管理器 与应用程序和应用服务器结合使用,可提供用来控制事务的范围和持续时间的服务。事务管理器还帮助协调跨多个事务资源管理器(例如本文中提供的示例中使用的数据库管理系统)的全局事务完成情况,提供对事务同步和恢复的支持,并提供与其他事务管理器实例通信的能力。

全局事务分布在多个资源管理器上。要协调全局事务,可协调事务管理器和所有参与的资源管理器都应该实现一个多阶段完成协议,比如两阶段提交 (2PC) 协议。尽管此协议有多种专用的实现,但 X/Open XA 是行业标准。

两阶段提交协议可确保要么所有参与者都提交更改,要么都不提交。BPM V8 Advanced 中的 SCA 实现利用基础 IBM WebSphere Application Server 的功能,为两阶段提交 ACID(原子性、一致性、隔离性和耐久性)协议的实现提供了支持。

类似的考虑因素可应用到基于 Windows .NET 的环境中,考虑 Microsoft Distributed Transaction Coordinator (MSDTC) 和 .NET Enterprise Services (COM+) 等功能。具体来讲,MSDTC 服务是现代 Microsoft Windows 版本的一个组件,负责协调分布在多个资源管理器(比如数据库和队列管理器)上的事务。MSDTC 执行着组件的事务协调职责,通常使用 COM 和 .NET 架构。

随着面向服务的架构 (SOA) 设计原则的整合和普及,事务概念已通过 WS-AT 标准应用到 SOAP Web 服务领域。有关 WS-Atomic Transaction 协议的出色介绍,请参阅 developerWorks 文章 让 Web 服务适合企业使用 WS-Atomic Transaction 协议和 WebSphere Application Server

WS-AT 是一种规范,它将传统事务行为的范围延伸到了 Web 服务领域。它在 WS-Transaction 领域的类似规范是 WS-Business Activity (WS-BA),后者定义了原子性业务活动的补偿机制。两种规范都是 WS-Transaction (WS-Tx) 分组的一部分。

WS-AT 规范同时受本系列提供的场景中使用的两种平台的支持:Microsoft .NET Framework 和 WebSphere Application Server/IBM BPM Java, Enterprise Edition (JEE) 服务器。

基于这些概念和理论假设,我们来看一下本文中描述的事务场景。如之前所述,该场景使用两个不同的数据库 Bank1 和 Bank2,它们基于两个不同机器上的两个不同的数据库引擎。数据库 Bank1 是 Windows 机器 A 上的一个 SQL Server 2008 (Express) 数据库,而数据库 Bank2 是 Windows 机器 B 上的一个 DB2 UDB (v 9.7) 数据库。机器 B 还安装了一个带 Process Designer 和 Integration Designer 的 BPM V8 Advanced。

两个数据库上的数据通过两种 Web 服务来管理:

  • 机器 A 上的 Charge Web 服务(使用 .NET WCF 开发)连接并操作 SQL Server 数据库。
  • 机器 B 上的 Credit Web 服务(使用 JAX-WS 开发)连接并操作 DB2 数据库。

显然,可以在同一个机器上使用两个数据库(基于同一个引擎)来实现此演示场景。或者,BPM 引擎(带 Process Center)可安装在与两个数据库机器分开的第三个机器上。此外,Web 服务也可以部署在不同的机器上。这里的重点是演示一种类似真实环境的场景,其中涉及的数据源常常基于安装在不同的物理(或虚拟)机器上的不同数据库引擎。

在两个数据库上,有一个包含帐户名称(在 Description 字段中)和金额(在 Amount 字段中)的 Accounts 表。在 IBM BPM 中,有一个名为 KWSBPM 的流程应用程序(KWS 是此演示中采用的全局前缀)。在这个流程应用程序中,有一个名为 KWSBPM – Process1 的业务流程定义 (BPD)。这个简单流程的目的是:

  1. (由一个包含基于相关 Coach 的显示界面的人工服务)向用户询问所请求事务的参数。例如,“将一笔 10 个价值单位的金额从 Bank1 上的 Karl 帐户转移到 Bank2 上的 Donald 帐户”。
  2. 使用(由一个 AIS 对)该事务的实现执行一个系统任务。稍后就会看到,AIS 由一个基于 SCA 的中介流实现,该中介流使用 WS-AT 协议调用了两个 Web 服务。
  3. 一个 Coach 显示事务的积极执行结果,另一个 Coach 显示事务失败结果,以及有关失败原因的一些详细信息(向用户解释对该事务的后续回滚)。

通过对上面第一条中的参数使用不同的值,您可以测试不同的执行场景,比如:

  • Bank1 和 Bank2 上有两个现有的帐户,以及一笔未违背 “扣费”(借方)帐户上的资金可用性的转账金额,将得到积极的交易提交结果。
  • “来源” (用于扣费)或 “目标”(用于贷方)帐户不存在,这会导致一个错误和事务回滚。
  • 尝试转移比 “扣费” 帐户上可用金额更大的金额,这会导致一个错误和事务回滚。

为了强调对我们在实现 BPM AOS 时采用的基于 SCA 的中介机制所提供的自动事务回滚的管理,在扣费操作之前,会在中介流中执行贷入操作,以便在发生扣费错误(例如由于金额不足)之后借方帐户上的贷入操作的回滚是明显和明确的。AIS 中实现的技术场景如下:

  • t1 时刻:使用 Web 服务 WSCreditBank2Svc 在 DB2 (Bank2) 上贷入资金
  • t2 时刻:使用 Web 服务 WSChargeBank1Svc 在 SQL Server (Bank1) 上借出资金

图 2 显示了此场景,本文后续章节将会提供更详细的介绍。

图 2. 事务场景
事务场景

建议的解决方案的构建块包括:

  • 数据库和数据源配置
  • BPM Process Designer 中的 BPMN 流程
  • Integration Designer 中的 AIS 实现,基于一种 SCA ESB 中介机制,分别为贷入和借出操作执行一个 Web 服务(一个基于 .NET WCF,另一个基于 Java JAX-WS)。

此解决方案的一个有趣方面是明显的分层级别,从一个业务级流程到数据层(数据资源层)。另一个要考虑的重要元素是使用 Web 服务和 WS-AT 协议引入的明确解耦,以便管理转账和事务上下文传播。

考虑到 AIS 是在 BPM Advanced 服务器上实现的,本演示中使用的 “事务管理器” 是 WebSphere Application Server,事务属性(稍后将介绍)在 SCA 中介的 SCA 组装图上配置。换句话说,WebSphere Application Server 将是 “事务协调器”,SQL Server 和 DB2 都将是 “事务资源”,由 WebSphere Application Server 事务协调器和 Microsoft Distributed Transaction Coordinator (MSDTC) 管理。


开始:

要理解解决方案的组件和完成本文中描述的步骤,您必须已经安装了 IBM Business Process Manager Advanced V8.0.1(包含 IBM Process Designer 和 IBM Integration Designer(我们在一个 Windows Server 2008 R2 64 位机器上进行了所有的测试)。对于解决方案的基于 Windows 的部分,您必须已经安装了 Visual Studio 2010 和 SQL Server 2008。

您应当熟悉 IBM Process Designer 和 IBM Integration Designer 创作工具,了解 AIS、基于 SCA 的实现、.NET 和基于 Java 的 Web 服务。

我们为本文提供了以下 4 个文件供您 下载。您可以下载并导入这些文件,使用它们作为参考,以执行实现本文中的示例场景的步骤。

KWSBPM.twx
一个用于 BPM V8.0.1 Advanced 的完整的 KWSBPM 流程应用程序,您可以将它导入 Process Designer 中。
KWSBPM_Main.zip
一个 KWSBPM AIS 实现的项目交换文件,您可以将它下载并导入 Integration Designer 中。这个 AIS 实现了解决方案的事务活动,从一个基于 ESB SCA 的中介流调用了两个 Web 服务(在 WS-AT 中)。
WSChargeBank1Soln.zip
.NET Web 服务,包含针对 Microsoft Visual Studio 2010 IDE 的压缩的解决方案和项目文件。
WSCreditBank2Project.zip
JAX-WS Web 服务,包含一个针对 IBM Integration Designer 的专用工作区或项目。

您需要将 SCA 实现(在 Integration Designer 中)与流程应用程序(在 Process Designer)相关联。在 Integration Designer 中,打开 Process Center 透视图,然后单击工作区中您想要与 SCA 服务关联的流程应用程序旁边的 Open。对于本文,该应用程序为 KWSBPM 流程应用程序。

要使事务 AIS 能够正确执行,您需要创建两个数据库(一个 Bank1 SQL Server 数据库位于机器 A 上,一个 Bank2 DB2 数据库位于机器 B 上),并为 IBM WebSphere Application Server(在 BPM 机器 B 上)上的 DB2 Bank2 数据库配置一个数据源,以下各节将会对此进行介绍。


创建数据库并配置数据源

我们的场景涉及一个分布式事务:两个(由不同银行托管且位于不同数据库上的)银行帐户之间的一次简单转账。这是一个很常见的场景。

我们将使用一个 SQL Server 2008 (Express) 和一个 DB2 (V9.7) 数据库引擎。第一个数据库 Bank1 位于机器 A 上的 SQL Server 上,包含一个 Accounts 表,该表包含 Bank1 的帐户。第二个数据库 Bank2 位于机器 B 上的 DB2 上,包含另一个 Accounts 表,如下所示。

清单 1. 机器 A 上的 SQL Server 上的 Bank1 数据库的 Accounts 表
            ID 	Description 	Amount
1 	Karl 		100
2 	Albert 		200
3 	Ricky 		300
清单 2. 机器 B 上的 DB2 上的 Bank2 数据库的 Accounts 表
ID 	Description 	Amount
1 	Donald 		1000
2 	Mickey 		2000
3 	Minnie 		3000

本系列中介绍的用例将采用这些值,所以在创建数据库、表、约束和触发器后,您可以将此信息插入这两个数据库中,如以下各节所述。

Accounts 表在 ID 字段(一个 Identity 字段)上有一个主键,在 Description 字段上有一个 UNIQUE 约束。还在 Accounts 表上创建了一个 INSERT / UPDATE 触发器;它的目的是检查一个帐户的余额,避免表中存在负值的金额:任何可能导致一个帐户的余额成为负值的 INSERT 或 UPDATE 操作都将被中止,回滚包装 INSERT 或 UPDATE 操作的隐式(本地)事务。

这里描述的两个数据库是 developerWorks 4 部分系列 使用 IBM Business Process Manager 开发事务 Advanced Integration Service 中描述的事务场景所使用的数据库。这两个数据库的设置已在以前的系列的第 1 部分 介绍和设置数据库 中介绍。但是,为了内容的完整性,本文也提供了这些操作说明。如果您已经实现这些数据库,那么可以跳过接下来的两节。

创建 Microsoft SQL Server 数据库

备注:如果已经在 之前的系列的第 1 部分 中实现了此数据库,那么可以跳过这一节。

前面已经介绍过,示例中两个数据库之一是 Microsoft SQL Server 2008 (Express) 数据库,安装在机器 A 上。在我们的示例中,SQL Server 数据库引擎被配置用于混合身份验证模式,我们可使用显式的 SQL Server 登录名(例如,管理帐户 “sa” 或另一个拥有必要权限的帐户)连接到该数据库。在 图 4 中可以看到,我们选择了 SQL Server and Windows Authentication mode(也就是混合身份验证模式)。要将 SQL Server 2008 Express 设置为这种安全模式,可执行 操作技巧:更改服务器身份验证模式 中描述的过程。

请注意,如果在安装期间选择 Windows 身份验证模式,那么 sa 登录名将会被禁用。如果以后将身份验证模式更改为 SQL Server and Windows Authentication 模式,sa 登录名仍会保持禁用。在这种情况下,要启用 sa 登录名,可使用 ALTER LOGIN 语句。sa 登录名仅能使用 SQL Server Authentication 连接到服务器。在我们的示例中,为了简便起见,WebSphere Application Server 和 BPM 中的 SQL Server 数据源使用 sa 登录名配置了一个身份验证别名。图 4 显示了 SQL Server 2008 上使用 SQL Server Management Studio 配置的混合模式。

在我们的实现中, sa 登录名的密码被传递给该进程,然后使用连接字符串传递到 AIS 和 Charge .NET Web 服务应用程序,以管理 SQL Server 数据库上的事务。在此实现中,此密码的值被假设为简单的 mypwd。显然,您需要将此值更改为您的 sa 密码,使用另一个登录名,甚至可以使用另一种方法将该密码传递给该服务,比如 Charge Web 服务应用程序中的一个配置文件,或者使用一种 Windows 身份验证模式。

图 3. SQL Server 混合身份验证模式
SQL Server 混合身份验证模式

SQL Server 数据库的名称为 Bank1。在此数据库中,有一个名为 Accounts 的表,它包含以下 3 个字段:

  • ID:帐户的数字 ID(int、身份(自动编号)、非空、主键)
  • Description:帐户的描述性名称(varchar、非空、惟一)
  • Amount:帐户上的金额(int、非空)

请注意,Description 字段上有一个 “惟一” 约束。

清单 1 给出了的 TSQL 脚本创建 Bank1 数据库、Accounts 表、该表上的一个触发器 Accounts_InsUpd,并在该表中填入了一些示例数据。

清单 3. 在 SQL Server 上创建 Bank1 数据库和相关的对象
-- *** BANK1 ***--
-- Create the Database (with default location, options and size)
CREATE DATABASE Bank1
GO

-- Create the table Bank1.Accounts, with its trigger and its data
USE Bank1
GO

CREATE TABLE Accounts(
	ID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
	Description varchar(50) NOT NULL UNIQUE,
	Amount int NOT NULL
	)
GO

CREATE TRIGGER Accounts_InsUpd ON Accounts FOR INSERT, UPDATE AS
/* Check the remaining amount: it has to be non-negative */
/* If the INSERT/UPDATE makes the remaining amount negative, it is aborted */
/* Warning: this trigger is implemented as a one-row trigger; it doesn't manage multi */
/* row INSERT/UPDATE */
DECLARE @remaining int	-- Remaining amount
IF (SELECT COUNT(*) FROM inserted) = 1
	BEGIN
	SELECT @remaining = Amount FROM inserted
	IF @remaining < 0
		BEGIN
		RAISERROR('Insufficient money.', 11, 1)
		ROLLBACK TRANSACTION
		END
	END
GO

INSERT Accounts VALUES('Karl',   100)
INSERT Accounts VALUES('Albert', 200)
INSERT Accounts VALUES('Ricky',  300)
GO

在本系列文章的后续文章中,您会看到在 Accounts 表上的更新触发器检测到将金额设为负值的尝试时,BPM AIS 实现中会出现异常。

要从该表读取这些值,可以使用 SQL Server Management Studio 发出 select * from dbo.Accounts 命令,如图 4 所示。

图 4. 读取 SQL Server 上的 Accounts 表
读取 SQL Server 上的 Accounts 表

要读取未提交的值(例如在准备和提交或回滚阶段的间隔时间内产生的值),可使用 with (readuncommitted) SQL Server 表提示,如下所示: select * from dbo.Accounts with (readuncommitted) 图 5 显示了 SQL Server Management Studio 中的这类查询。

图 5. 读取 SQL Server 上未提交的值
读取 SQL Server 上未提交的值

readuncommitted 表提示指定允许 “脏读取”。如果没有发出共享锁来预防其他事务修改当前事务读取的数据,那么其他事务设置的独占锁不会阻止当前事务读取锁定的数据。允许脏读取可以获得更高的并发性,但代价是读取的数据修改,这些修改随后由其他事务回滚。请注意,这可能为用户提供从未提交的数据,或者导致用户两次看到相同的记录(或完全看不到)。稍后您会看到,一个等效选项允许在 DB2 数据库上的一个 select 语句上执行脏读取。

此处 可以下载 Microsoft SQL Server 2008 Express Edition with SP3,在 此处 可以下载 Microsoft SQL Server 2008 Management Studio Express。

为了简便起见,我们将使用标准的管理用户 “sa” 访问 SQL Server,表名将添加默认的 SQL Server 模式名 “dbo” 作为前缀,所以 Accounts 表的完整名称为:dbo.Accounts。

一定要考虑到这样一个事实,SQL Server 的默认安装支持由 Microsoft Distributed Transaction Coordinator (MSDTC) 管理的基于 XA 的事务,但在 JDBC 驱动程序访问 SQL Server 引擎时,需要进行额外的配置才能实现 XA 事务支持,如本例中所示。这种支持已在 Microsoft SQL Server 2008 – 了解 XA 事务 和其他来源中介绍,比如 IBM WebSphere Enterprise Service Bus 信息中心。JDBC 分布式事务组件包含在 SQL Server 安装的 Microsoft JDBC 驱动程序的 xa 目录中。这些组件包含 xa_install.sql 和 sqljdbc_xa.dll 文件。完成以下步骤,以便在 SQL Server 安装上执行这种一次性配置,通过 JDBC 实现 XA 事务支持(在我们的场景中,机器 A 上需要这些配置,它运行的是 SQL Server 2008 Express)。

为了简便起见,我们将使用标准的管理用户 “sa” 访问 SQL Server,表名将添加默认的 SQL Server 模式名 “dbo” 作为前缀,所以 Accounts 表的完整名称为:dbo.Accounts。

为 MSDTC 服务启用 XA 事务

MSDTC 服务必须在 Service Manager 中标记为 Automatic,以确保在启动 SQL Server 服务时已经在运行它。要为 MSDTC 启用 XA 事务,请执行以下步骤:

  1. 选择 Start => Control Panel => Administrative Tools,然后打开 Component Services
  2. 展开 Component ServicesComputers,然后右键单击 My Computer 并选择 Properties
  3. 单击 MSDTC 选项卡,然后单击 Security Configuration
  4. 勾选 Enable XA Transactions,然后单击 OK。这会重新启动 MSDTC 服务。
  5. 再次单击 OK 关闭 Properties 对话框,然后关闭 Component Services
  6. 停止并重新启动 SQL Server,确保它同步了 MSDTC 更改。
图 6. 配置 MSDTC 安全性和 XA 支持
配置 MSDTC 安全性和 XA 支持

配置 JDBC 分布式事务组件

要配置 JDBC 事务组件,可执行以下操作:

  1. 将 sqljdbc_xa.dll 从 JDBC 安装目录复制到将参与分布式事务的每个 SQL Server 计算机的 bin 目录。

    备注:如果将 XA 事务用于 32 位 SQL Server,可使用 x86 文件夹内的 sqljdbc_xa.dll 文件,即使 SQL Server 安装在 x64 处理器上。如果将 XA 事务用于 x64 处理器上的 64 位 SQL Server,可使用 x64 文件夹中的 sqljdbc_xa.dll 文件。如果将 XA 事务用于 Itanium 处理器上的 64 位 SQL Server,那么可以使用 IA64 文件夹中的 sqljdbc_xa.dll 文件。

  2. 在每个将参与分布式事务的 SQL Server 实例上执行数据库脚本 xa_install.sql。该脚本会安装由 sqljdbc_xa.dll 调用的扩展的存储过程。这些扩展的存储过程为 Microsoft SQL Server JDBC Driver 实现了分布式事务和 XA 支持。您需要以 SQL Server 实例的管理员身份运行此脚本。
  3. 要为将参与 JDBC 驱动程序的分布式事务的特定用户授予相应的权限,可将该用户添加到 SqlJDBCXAUser 角色中。

创建 IBM DB2 数据库

备注:如果您已经在 之前的系列的第 1 部分 中实现了此数据库,那么可以跳过这一节。

机器 B(运行 DB2 V9.7)有一个 Bank2 数据库,其中包含一个 Accounts 表和两个触发器(针对 Insert 和 Update),以确保表中没有负金额,类似于 SQL Server Bank1 数据库。

清单 2 显示了在 Bank2 数据库上创建 Accounts 表的代码,以及相关的约束和触发器。为了简便起见,这里使用的模式名称为 ADMINISTRATOR,但您也可以选择使用不同的名称。清单 2 的第一部分是一段初始安装一个空 Bank2 数据库的示例脚本。

清单 4. 在 DB2 上创建 Bank2 数据库和相关的对象
------------------------------------------------
-- Possible DDL Statement for Bank2 database creation
------------------------------------------------

CREATE DATABASE BANK2 AUTOMATIC STORAGE YES  ON 'C:\' DBPATH ON 'C:\' ALIAS BANK2 
USING CODESET IBM-1252 TERRITORY US COLLATE USING SYSTEM PAGESIZE 4096 WITH 'BANK2';

------------------------------------------------
-- DDL Statements for table "ADMINISTRATOR"."ACCOUNTS"
-- Note: to be executed on BANK2 database
------------------------------------------------

CREATE TABLE "ADMINISTRATOR"."ACCOUNTS"  (
		  "ID" INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (  
		    START WITH +0  
		    INCREMENT BY +1  
		    MINVALUE +0  
		    MAXVALUE +2147483647  
		    NO CYCLE  
		    NO CACHE  
		    NO ORDER ) ,
		  "DESCRIPTION" VARCHAR(50) NOT NULL ,
		  "AMOUNT" INTEGER NOT NULL )   
		 IN "USERSPACE1" ;

-- DDL Statements for indexes on Table "ADMINISTRATOR"."ACCOUNTS"

CREATE INDEX "ADMINISTRATOR"."CC1348226303097" ON "ADMINISTRATOR"."ACCOUNTS"
		("ID" ASC)
		
		COMPRESS NO ALLOW REVERSE SCANS;

-- DDL Statements for primary key on Table "ADMINISTRATOR"."ACCOUNTS"

ALTER TABLE "ADMINISTRATOR"."ACCOUNTS"
	ADD CONSTRAINT "CC1348226303097" PRIMARY KEY
		("ID");

-- DDL Statements for unique constraints on Table "ADMINISTRATOR"."ACCOUNTS"

ALTER TABLE "ADMINISTRATOR"."ACCOUNTS"
	ADD CONSTRAINT "CC1348501255207" UNIQUE
		("DESCRIPTION");

-------------------------------
-- DDL Statements for Triggers
-------------------------------

SET CURRENT SCHEMA = "ADMINISTRATOR";
SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","ADMINISTRATOR";
CREATE TRIGGER ADMINISTRATOR.ACCOUNTS_INS AFTER  INSERT  ON ADMINISTRATOR.ACCOUNTS
 REFERENCING  NEW AS new_row  NEW_TABLE AS new_table  FOR EACH ROW  MODE
DB2SQL
BEGIN ATOMIC
DECLARE remaining INT;--
SET remaining  = new_row.Amount;--
IF remaining < 0 THEN
SIGNAL SQLSTATE '70006' SET MESSAGE_TEXT = 'Insufficient money.';--
END IF;--
END;

SET CURRENT SCHEMA = "ADMINISTRATOR";
SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","ADMINISTRATOR";
CREATE TRIGGER ADMINISTRATOR.ACCOUNTS_UPD AFTER  UPDATE OF AMOUNT ON ADMINISTRATOR.ACCOUNTS
 REFERENCING  OLD AS old_row  NEW AS new_row  OLD_TABLE AS old_table  NEW_TABLE
AS new_table  FOR EACH ROW  MODE DB2SQL
BEGIN ATOMIC
DECLARE remaining INT;--
SET remaining  = new_row.Amount;--
IF remaining < 0 THEN
SIGNAL SQLSTATE '70006' SET MESSAGE_TEXT = 'Insufficient money.';--
END IF;--
END;

-------------------------------------------
-- Create some values in the Bank2 database
-------------------------------------------
INSERT INTO ADMINISTRATOR.Accounts (DESCRIPTION, AMOUNT) VALUES('Donald', 1000);
INSERT INTO ADMINISTRATOR.Accounts (DESCRIPTION, AMOUNT) VALUES('Mickey', 2000);
INSERT INTO ADMINISTRATOR.Accounts (DESCRIPTION, AMOUNT) VALUES('Minnie', 3000);

请注意,在 DB2 中,我们使用了 SQLSTATE >=70000 来定义 Insufficient money 的自定义错误代码。

要从 DB2 Control Center 读取该表的值,可打开 Bank2 数据库,右键单击 Accounts 表并选择 Open,如图 7 所示。

图 7. 使用 Control Center 从 DB2 读取 Accounts 数据
使用 Control Center 从 DB2 读取 Accounts 数据

也可以使用 DB2 命令行处理器发出以下命令,如图 8 所示:

connect to BANK2
SELECT * FROM ADMINISTRATOR.ACCOUNTS
图 8. 使用命令行从 DB2 读取 Accounts 数据
使用命令行从 DB2 读取 Accounts 数据

可使用以下命令从 Accounts 表读取未提交的值:
select * from administrator.accounts with ur

图 9. 从 DB2 读取未提交的值
从 DB2 读取未提交的值

select 语句上的 with ur 选项设置未提交的读取隔离级别。

为机器 B 上的 Bank2 配置 DB2 数据源

备注:这里给出的配置与 前一个系列的第 1 部分 中的 “为机器 B 上的 Bank2 配置 DB2 数据源” 一节中相同。如果您已经配置了此数据源,那么可以跳过这一节。

为了支持(机器 B 上的)WebSphere Application Server 上的 Credit Web 服务对 Bank2 DB2 数据库进行访问,需要在 WebSphere Application Server 上配置一个数据源。具体来讲,要连接到机器 B 上的 Bank2 DB2 数据库,需要一个针对 DB2 的 JDBC 驱动程序、一个身份验证别名和一个数据源。WebSphere Application Server for BPM 上已经定义了您可以使用的 JDBC 驱动程序(DB2 Using IBM JCC Driver (XA))。这个驱动程序支持 XA 事务,该驱动程序的实现类名为 com.ibm.db2.jcc.DB2XADataSource

图 10. 针对 DB2 的 JDBC 提供程序
针对 DB2 的 JDBC 提供程序

图 15 显示了用于访问 DB2 上的 Bank2 数据库的身份验证别名,在我们的示例中,我们使用了 IBMBPMNode01/bpmadmin。重要的是,帐户必须拥有必要的权利来访问和操作 DB2 Bank2 数据库,以及在该数据库中定义的 Accounts 表上的数据。例如,因为我们将 Accounts 表的模式配置为 ADMINISTRATOR,所以您可以使用管理帐户定义身份验证别名,或者使用另一个必须在 DB2 数据库上启用了正确授权的帐户(比如 bpmadmin)。

图 11. 访问 DB2 的身份验证别名
访问 DB2 的身份验证别名

按以下方式配置用于访问机器 B 上的 Bank2 数据库的 jdbc/bank2db2 数据源(在本例中为 IBM BPM 服务器)(参见图 12 和图 13)。

  • Scope:为您的提供程序和数据源定义的范围;例如 cells:IBMBPMNode01Cell:nodes:IBMBPMNode01:servers:server
  • Provider:为 DB2 选择的 JDBC 提供程序;例如您之前定义的 DB2 using IBM JCC Driver (XA)
  • Namebank2db2
  • JNDI namejdbc/bank2db2
  • 勾选 Use this data source in container managed persistence (CMP)
  • Description:任何描述性文本
    图 12. 访问 DB2 的 JDBC 数据源(2 部分中的第 1 部分)
    访问 DB2 的 JDBC 数据源(2 部分中的第 1 部分)
  • 选择 Select a data store helper class,然后对于 Data store helper classes provided by WebSphere Application Server,选择 DB2 Universal data store helper
  • Authentication alias for XA recoveryIBMBPMNode01/bpmadmin
  • Component-managed authentication aliasIBMBPMNode01/bpmadmin
  • Driver Type4
  • Database nameBANK2
  • Server name:服务器名称,例如 IBMBPM
  • Port number:DB2 数据库的端口号;例如 50000
    图 13. 访问 DB2 的 JDBC 数据源(由两部分组成的系列文章的第 2 部分)
    访问 DB2 的 JDBC 数据源(由两部分组成的系列文章的第 2 部分)

在图 13 所示的配置中,请注意身份验证别名 IBMBPMNode01/bpmadmin 同时用于 Authentication alias for XA recoveryComponent-managed authentication alias

总之,为了访问机器 B 上的 DB2 Bank2 数据库,我们定义了一个名为 bank2db2(jdbc 名称:jdbc/bank2db2)和一个 bpmadmin 身份验证别名。


结束语

在本系列文章的第 1 部分中,我们进行了大体概括,描述了本系列将要构建的分布式事务场景的组件。您学习了如何在 SQL Server 和 DB2 Server 上创建数据库,如何在 IBM BPM 应用服务器上配置数据源。在第 2 部分中,您将学习如何配置事务支持和实现两个事务 Web 服务(分别针对 Credit 和 Debit 操作)。


致谢

感谢同事 Giuseppe Bottura 和 Simone Chiucchi 审阅本文,感谢同事 Stefano Angrisano、Matteo Franciolli 和 Daniele Rossi 对本文所做的贡献。还要感谢 Andrew J. Howes、Billy Lo、Frank I. Toth、Dave Screen、Callum Jackson、Konstantin Luttenberger 和 Oliver Rebmann 提供富有启发性、引人深思的 developerWorks 文章。


下载

描述名字大小
用于 IBM Process Designer 的流程应用程序KWSBPM.twx1.3MB
AIS(用于 IBM Integration Designer)KWSBPM_Main.zip276KB
.NET Web 服务(用于 Visual Studio)WSChargeBank1Soln.zip47KB
JAX-WS Web 服务(用于 Integration Designer)WSCreditBank2Project.zip28KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=958093
ArticleTitle=使用 IBM BPM Advanced Integration Service 开发分布式 WS-AT 事务,第 1 部分: 数据库介绍和设置
publish-date=08282013