通过将一个或多个步骤包含在不可分的工作单元,事务可确保数据的完整性和一致性。本章包括以下几个部分:
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。例如,将资金从支票帐户转到储蓄帐户中是一项事务,按步骤如下进行:
检查支票帐户是否有足够的资金来支付此转帐操作。
如果支票帐户中有足够的资金,则将该笔资金记入此帐户的借方。
将这些资金记入储蓄帐户的贷方。
将此次转帐记录到支票帐户日志中。
将此次转帐记录到储蓄帐户日志中。
如果这些步骤的任何一个步骤失败,则必须撤消在前面的步骤中所做的所有更改,而且支票帐户和储蓄帐户的状态必须与它们在事务开始之前的状态相同。该事件称为回滚。如果所有步骤均成功完成,那么事务即处于已提交状态。事务以提交或回滚结束。
另请参见:
J2EE 技术中的事务处理包括以下五个参与者:
通过实现各自的 API 和功能,每个实体均有助于提高事务处理的可靠性,如下所述:
事务管理器提供了支持事务划分、事务资源管理、同步和事务上下文传播所需的服务和管理功能。
Application Server 提供了支持应用程序运行时环境(包含事务状态管理)所需的基础结构。
应用程序可以使用资源管理器(通过资源适配器)访问资源。资源管理器通过实现事务管理器用来就事务关联、事务完成及恢复工作进行通信的事务资源接口来参与分布式事务。例如,关系型数据库服务器就是这样的资源管理器。
资源适配器是一个系统级的软件库,应用程序服务器或客户机可使用它连接到资源管理器。资源适配器通常专用于资源管理器。它以库的形式存在,并在使用它的客户机地址空间中使用。例如,JDBC 驱动程序就是这样的资源适配器。
为在应用程序服务器环境中运行而开发的事务用户应用程序可以使用 JNDI 查找事务数据源及事务管理器(可选)。应用程序可使用 Enterprise Bean 的声明事务属性设置或明确的程序事务划分。
另请参见:
Application Server 通过以下 JDBC 驱动程序的恢复实现为一些已知问题提供了解决方法。除非被明确禁用,否则将使用这些解决方法。
Oracle 瘦驱动程序-不管输入标志如何,XAResource.recover 方法总是重复返回怀疑有问题的同一组 Xid。根据 XA 规范,事务管理器最初使用 TMSTARTSCAN 调用此方法,然后使用 TMNOFLAGS 重复调用此方法,直到不再返回任何 Xid。XAResource.commit 方法也有一些问题。
要禁用 Application Server 解决方法,请将 oracle-xa-recovery-workaround 属性值设置为 false。有关如何设置属性的详细信息,请参见配置 Application Server 从事务中恢复的方式。
这些解决方法并不暗指支持任何特定的 JDBC 驱动程序。
Application Server 基于管理控制台中的设置处理事务。
本节说明如何配置事务设置:
有关事务的其他信息,请参见下列各节:
由于服务器崩溃或资源管理器崩溃,事务可能未完成。完成这些被搁置的事务并将其从故障中恢复至关重要。Application Server 旨在在服务器启动时从故障中恢复并完成这些事务。
执行恢复操作时,如果无法访问某些资源,则服务器重新启动操作可能被延迟,因为服务器正在尝试恢复事务。
如果事务跨服务器进行,启动该事务的服务器会联系其他服务器以获得事务的结果。如果无法访问其他服务器,则该事务将使用“试探性决定”字段来确定结果。
在树组件中,选择“配置”节点。
选择要配置的实例:
选择“事务服务”节点。
要启用恢复未完成事务的操作,请在“重新启动时”字段中选取“恢复”。
在“重试超时”字段中,设置 Application Server 尝试连接无法访问的服务器的时间值(以秒为单位)。默认值为 10 分钟(600 秒)。
在“试探性决定”字段中,为事务中无法访问的服务器设置策略。
除非有充分的理由将此字段设置为“提交”,否则请将“试探性决定”保留设置为“回滚”。提交不确定的事务会破坏应用程序的数据完整性。
设置任何所需的属性。
单击“添加属性”按钮,在“名称”和“值”字段中键入值,然后选中“名称”左侧的框以激活属性。
单击“保存”。
重新启动 Application Server。
默认情况下,服务器不会使事务超时。即,服务器无限期地等待事务完成。如果为事务设置了超时值,而事务在配置的时间内未完成,则 Application Server 将回滚此事务。
在树组件中,选择“配置”节点。
选择要配置的实例:
选择“事务服务”节点。
在“事务超时”字段中,输入事务超时之前等待的秒数。
事务超时的默认值为 0 秒。此值禁用事务超时。
单击“保存”。
重新启动 Application Server。
为了保持被调用资源的数据完整性,同时为了能够从故障中恢复,事务日志将记录有关每个事务的信息。事务日志保存在“事务日志位置”字段指定的目录的 tx 子目录中。用户无法读取这些日志。
在树组件中,选择“配置”节点。
选择要配置的实例:
选择“事务服务”节点。
在“事务日志位置”字段中输入事务日志的位置。
创建 tx 子目录,事务日志将保存在该目录下。
默认值为${com.sun.aas.instanceRoot}/logs。${com.sun.aas.instanceRoot} 变量为实例的名称,且在启动 Application Server 实例时设置。要查看 ${com.sun.aas.instanceRoot} 值,请单击“实际值”。
单击“保存”。
重新启动 Application Server。
密钥点操作将压缩事务日志文件。密钥点间隔是日志中密钥点操作之间的事务数量。密钥点操作可以减小事务日志文件的大小。密钥点间隔数越大(例如,2048),事务日志文件也越大,但密钥点操作较少,性能可能更佳。密钥点间隔越小(例如,256),日志文件也越小,而同时由于密钥点操作较为频繁,性能会略微降低。