权衡Apache Geronimo EJB事务选项,第3部分: 综合所有事务2011-03-13 IBM Jonathan SagorinJonathan Sagorin 在 由三部分组成的系列文章 的最后一部分中对 Enterprise Java™Beans(EJB)事务进行了全面的揭示。探索 Apache Geronimo 应用服务器上与容器管理事务和 bean 管理事务都相关的难题和附加实现与配置选项。简介在本系列的 第 1 部分 和 第 2 部分 中,您简单了解了 bean 管理的和容器管理的 EJB 事务以及如何在 Geronimo 应用服务器上实现它们。那么接下来呢?在使用 EJB 事务时,您应考虑哪些其他事务设置是可用的,以及需要考虑的其他事项?本文首先概述第 1 和第 2 部分中的事务选择:容器管理或 bean 管理的事务。接着将了解并发控制策略和方法,确保事务执行时没有数据损失。您还将了解隔离级别(如何控制事务与其他事务的隔离)并了解如何设置事务超时。最后,您将了解赞成和反对使用分布式事务的理由。EJB 事务:我的选择是什么?在实现 EJB 事务时,有两种选择:容器管理或 bean 管理的事务。使用容器管理的事务时,将在部署描述符中指定事务行为。EJB 容器负责控制事务边界。您为整个 enterprise bean、bean 上的个别方法或两者指定事务属性。事务属性的选择有:RequiredRequiresNewSupportsMandatoryNotSupportedNever使用 bean 管理的事务时,您编程控制事务边界并决定事务开始、提交和回滚的时机。在 bean 管理的事务中,可以在 Java Transaction API(JTA)或 Java Database Connectivity(JDBC)事务实现之间进行选择。JTA 使用 javax.transaction.UserTransaction 接口控制事务,而 JDBC 事务则直接经 java.sql.Connection 接口执行操作来控制事务行为。如果使用会话或消息驱动 bean(MDB),那么可以实现 bean 管理或容器管理事务。然而,实体 bean 只可以使用容器管理事务。表 1 按每个 enterprise bean 实现的事务类型总结了这些选择。表 1. enteprise bean 的事务类型选择
| 事务类型 | 会话 bean | 实体 bean | 消息驱动 bean |
| bean 管理 | x | | x |
| 事务管理 | x | x | x |
如果不确定您的 bean 使用哪种事务类型,Sun Microsystems 建议对 enterprise bean 使用具有 required 属性的容器管理的事务。对于开发人员,使用容器管理的事务会比较简单并且需更比较少的工作量。在 bean 方法中不要求事务逻辑。在 enterprise bean 的方法级别上划分事务边界。bean 方法必须运行在事务上下文中或不在其中运行。如果要求对事务边界进行更严格的控制,那么使用 bean 管理的事务。如果期望在 enterprise bean 中拥有长期过程,那么使用 bean 管理的事务。对于本文的目的,希望事务运行尽可能短的时间。如果使用容器管理事务,划分边界的粒度不够细,它们处于 bean 方法级别。通过使用 bean 管理的事务,可以限制事务的持续时间为短暂的。可以在事务中隔离数据库操作并允许长期过程在事务作用域之外运行。这将确保不会阻塞访问同一数据的其他任何事务。