WebSphere Application Server(WAS)8.5.5教程第十讲
续前篇。
一、事务管理
WebSphere Application Server(WAS) 的事务管理是一大优势,相比于 Tomcat 等轻量级服务器,WAS 提供了 企业级事务管理(JTA,Java Transaction API) 支持,特别适用于复杂的 分布式事务 场景,比如涉及多个数据库、JMS 消息、EJB 的场合。
1、什么是事务管理?
事务管理是一种机制,用于保证一组操作要么全部成功(提交),要么全部失败(回滚),从而保持数据的一致性。
WebSphere 提供的事务管理是基于 JTA(Java Transaction API) 实现的,属于 Java EE 规范的一部分,支持:
-
本地事务(Local Transaction):一个数据源内的事务(如单个数据库连接)
-
全局事务(Global Transaction):多个资源之间的事务协调(如多个数据库 + JMS)
2、WAS 事务管理关键组件
组件名 | 说明 |
---|---|
Transaction Manager(事务管理器) | WAS 内置组件,协调资源之间的提交和回滚操作 |
JTA 接口支持 | 应用可以通过 javax.transaction.UserTransaction 或容器管理事务 |
数据源(JDBC)或 JMS 连接工厂(Connection Factory) | 必须启用事务支持(XA)才能参与全局事务 |
事务日志(Transaction Logs) | 存储事务状态,确保崩溃恢复 |
应用服务器容器支持 | 对 EJB、Servlet、JMS 自动管理事务边界(声明式事务) |
3、事务管理使用方式(两种)
1. 容器管理事务(CMT - Container Managed Transaction)
这是在 EJB、JPA、JMS、JAX-RS 中最常用的方式,开发者不需要手动控制事务边界,只需使用注解或配置:
@Stateless
public class OrderService {@EJBprivate InventoryBean inventory;public void createOrder() {// WebSphere 自动开启事务inventory.reserveItem();// 如果发生异常,容器自动回滚事务}
}
你可以在 ejb-jar.xml
或使用注解 @TransactionAttribute
配置事务属性,比如 REQUIRED
, REQUIRES_NEW
。
2. 程序管理事务(BMT - Bean Managed Transaction)
通过 javax.transaction.UserTransaction
显式管理事务,适用于 Servlet、JSP、普通 Java 类。
@Resource
UserTransaction ut;public void doSomething() {try {ut.begin();// 操作数据库或其他资源ut.commit();} catch (Exception e) {ut.rollback();}
}
注意:UserTransaction
只能在 JTA 支持的环境中使用(WAS 支持,Tomcat 不支持)。
4、配置使用(WAS 控制台)
在 WAS 控制台中,你可以做以下事务相关配置:
1.导航到:
服务器 -> 服务器类型 -> WebSphere Application Server -> [你的服务器] -> 事务服务
2.配置选项包括:
配置项 | 说明 |
---|---|
启用事务日志 | 崩溃后可以恢复未完成事务 |
总事务超时时间 | 控制事务最多运行多久 |
允许全局事务 | 必须开启才能支持多个资源参与 |
启用恢复 | 启用故障恢复机制 |
并发控制 | 支持事务间并发行为的控制 |
5、与 Tomcat 的对比
特性 | WAS | Tomcat |
---|---|---|
JTA 支持 | 原生支持,完整事务协调器 | 不支持,需要集成第三方如 Atomikos、Bitronix |
XA 事务 | 支持(数据库、JMS) | 不支持 |
容器事务管理 | 支持 EJB 和容器自动管理事务 | 不支持(除非整合 Spring) |
恢复与日志记录 | 支持事务恢复和 crash recovery | 无内置支持 |
6、典型使用场景
-
多个数据库操作事务一致性(如分布式金融系统)
-
JMS + DB 的一致性(先写数据库再发消息)
-
业务流程自动补偿机制支持
-
EJB 模块间事务协调
7、最佳实践建议
-
优先使用容器管理事务,简洁且不容易出错。
-
配置合理的事务超时,防止死锁或长事务。
-
开启事务日志和恢复功能,保障系统可靠性。
-
若涉及 多个资源(DB + JMS),请使用 支持 XA 的资源适配器。
二、示例
本次目标:
-
配置 XA 数据源 支持全局事务。
-
配置 JMS + 数据库事务协调。
-
在 Java 服务任务中管理事务。
-
使用 事务日志 进行故障排查。
1、创建支持事务的 XA 数据源
XA 数据源允许多个资源(如数据库、JMS 等)参与全局事务。通过 WebSphere 控制台,你可以配置 XA 数据源,使其支持分布式事务。
步骤 1:进入数据源配置页面
-
登录到 WebSphere 管理控制台。
-
导航到
资源
➝JDBC
➝数据源
(Data sources)。
步骤 2:创建 XA 数据源
-
点击
新建
。 -
选择
XA 数据源
,然后点击下一步
。 -
填写以下信息:
-
数据源名称:如
MyXADataSource
-
JDBC 驱动:选择合适的数据库驱动(例如:
Oracle XA DataSource
、DB2 XA
)。 -
数据库连接信息:填写数据库主机、端口、数据库名、用户名、密码等。
-
事务管理类型:选择
全局事务(XA)
。
-
-
配置连接池大小、连接超时等其他参数。
-
点击
下一步
,然后完成
。
步骤 3:测试数据源
-
在数据源配置完成后,点击
测试连接
按钮,确保连接成功。 -
确保数据源能够正确连接到数据库,并且支持 XA 分布式事务。
2、配置 JMS 和数据库的事务协调
JMS(Java Message Service)和数据库通常需要协调事务,确保消息发送和数据库更新一致。通过配置 事务管理器 和 XA 数据源,可以实现 JMS 和数据库的事务协调。
步骤 1:创建 JMS 连接工厂
-
导航到
资源
➝JMS
➝连接工厂
。 -
创建一个新的连接工厂,选择
XA 连接工厂
。 -
配置连接工厂的相关属性,包括:
-
JMS 服务端点(如 ActiveMQ、IBM MQ)。
-
连接池大小等。
-
步骤 2:配置 JMS 队列或主题
-
在 JMS 设置下,创建 JMS 队列 或 JMS 主题。
-
配置队列的 全局事务 支持,确保消息在事务中传递。
-
确保队列和数据库都配置为 XA 资源,以便事务可以跨多个资源工作。
步骤 3:配置 JMS 事务管理
-
在 JMS 连接工厂 中,启用事务支持。
确保 JMS 事务 被启用,允许消息的发送与数据库操作在同一个事务内执行。 -
配置事务超时和消息传递的事务行为。
3、在 Java 服务任务中管理事务
在 Java 服务任务 中,你可以手动管理事务(称为程序管理事务,BMT),控制事务的提交和回滚。
步骤 1:在 Java 服务任务中使用 UserTransaction
控制事务
-
在 Process Designer 中,创建或编辑一个服务任务。
-
在服务任务代码中使用
javax.transaction.UserTransaction
来手动控制事务的边界。
import javax.transaction.UserTransaction;
import javax.naming.InitialContext;
import javax.naming.NamingException;public class TransactionExample {public void execute() {try {InitialContext context = new InitialContext();UserTransaction ut = (UserTransaction) context.lookup("java:comp/UserTransaction");// 开始事务ut.begin();// 执行数据库操作、JMS 消息发送等performDatabaseOperation();sendMessage();// 提交事务ut.commit();} catch (Exception e) {// 事务回滚try {ut.rollback();} catch (Exception rollbackEx) {rollbackEx.printStackTrace();}}}private void performDatabaseOperation() {// 数据库操作代码}private void sendMessage() {// 发送 JMS 消息的代码}
}
步骤 2:控制事务的提交与回滚
-
使用
ut.begin()
开始事务。 -
使用
ut.commit()
提交事务。 -
如果出现异常,使用
ut.rollback()
回滚事务。
4、使用事务日志进行故障恢复和排查
WebSphere 提供了 事务日志,帮助在系统崩溃或失败时恢复未提交的事务。你可以通过以下方式配置和查看事务日志:
步骤 1:启用事务日志
1.在 WebSphere 控制台中,导航到:
服务器 > 服务器类型 > WebSphere Application Server > [你的服务器名称] > 容器设置 > 容器服务 > 事务服务
2.在 事务服务 配置页面中,确保 启用事务日志 和 事务恢复 被启用。
步骤 2:查看事务日志
-
WebSphere 会将事务日志写入文件系统,日志文件通常位于:
<WAS_INSTALL_DIR>/profiles/<PROFILE_NAME>/logs/<SERVER_NAME>/transaction
-
你可以查看这些日志,分析事务的提交、回滚记录以及可能的失败原因。
步骤 3:故障恢复
-
如果 WebSphere 在处理事务时发生崩溃,事务日志会帮助恢复未完成的事务。
-
WebSphere 会自动根据事务日志恢复所有未提交的事务,确保数据一致性。
5、总结与最佳实践
操作 | 建议 |
---|---|
XA 数据源配置 | 启用分布式事务,确保数据库和 JMS 一致性 |
JMS 和数据库事务协调 | 配置 XA 连接工厂和队列,确保跨资源事务一致性 |
Java 服务任务事务管理 | 使用 UserTransaction 明确控制事务提交和回滚 |
启用事务日志与恢复 | 开启事务日志,确保事务失败时可以恢复 |
通过这些配置,你可以在 WebSphere 中灵活地管理事务,保证在复杂的分布式环境中,涉及多个资源(如数据库、JMS)时的一致性。
未完,待续!