什么是事务
“事务”是处理成组操作的一种机制,该机制将一组操作作为一个整体对待。
一个事务中的所有操作要么全部发生,要么一个都不发生。
事务所涉及的操作可能依赖于多个服务器和数据库。
我们都知道,事务应具有以下ACID 属性:
原子性-全部执行或什么都不执行;事务中涉及的所有操作要么都实现,要么都不实现。
一致性-数据库必须从一个一致的状态修改为另一个一致的状态。如果系统或数据库在事务发生期间失败,将还原到(回滚到)原始状态。
隔离性-就事务访问的数据库记录而言,一个正在执行的事务独立于其它正在执行的事务。
持久性-事务一旦提交,其在系统或数据库失败后可以还原到提交时的状态。
事务是一组相关的操作。这些操作要么全部执行,要么一个都不执行。例如,使用Web 应用程序购买产品便是一个事务,该事务包括多个操作,如选择产品、下订单、减少应用程序数据库中待售产品的数量、从买方的信用卡帐户中借记相应金额的货款,以及在卖方的帐中贷记这些货款。
要成功完成此事务,必须成功执行该事务中涉及的所有操作。此时,称事务已提交。不过,即使只有一个操作失败,该事务也将被回滚。这意味着必须撤消在该失败操作之前执行的所有操作产生的影响。
事务管理是指在应用程序和资源之间对事务进行的端到端管理。提供端到端事务管理的两个基本组件是事务管理器和资源管理器。事务管理器包含用于实现事务管理的逻辑。资源管理器是用于实现资源和事务管理器交互的驱动程序。事务管理器代表应用程序管理事务。事务管理器通过与参与事务的所有资源管理器通信来协调应用程序的命令,从而启动和完成事务。大致架构参见下图:
在具体的事务管理上,通常采用两阶段事务提交(2-Phase Transition Commit)协议,其主要特性如下:
两阶段提交(2PC) 协议使用两个步骤提交分布式事务中的更改。
阶段1 :要求RM 准备进行更改
阶段2 :要求RM 提交更改并使更改成为永久性的,或者回滚整个事务
全局事务ID(XID) 用来跟踪与分布式事务相关联的所有更改
在WLS中使用JTA实现和管理事务,具体来说,WLS JTA可为业务事务提供以下支持:
• 在客户端应用程序启动事务时创建唯一的事务标识符。
• 支持可选事务名称(描述事务所表示的业务流程)。事务名称使统计信息和错误消息更易于理解。
• 与WebLogic Server基础结构配合工作以跟踪事务涉及的对象,因此必须在事务准备好提交时与之协调。
• 资源管理器(通常为数据库)被访问时,JTA代表事务通知资源管理器。然后,资源管理器将锁定被访问的记录,直到事务结束为止。
• 在事务完成时编制两阶段提交,这可确保所有事务参与者同时提交它们的更新。
在WLS中,具体的2PC提交实现上,不得不谈扩展架构(XA)协议,其具有如下特性
是在WLS和RM之间使用的接口
实现2PC协议
使程序能够控制分布式事务所涉及的RM
WLS中事务可以分为本地事务与全局事务两种类型:
本地事务处理单个资源管理器。对于这类事务,在WLS和资源管理器之间使用非扩展架构(非XA)接口。
全局事务可处理多个资源管理器。对于这类事务,在WLS和资源管理器之间使用扩展架构(XA)接口。
具体到数据库侧,通常由对应的数据库驱动决定其是否提供了XA接口实现,XA数据库驱动程序支持分布式事务或全局事务;而非XA驱动程序支持本地事务。但是,如果XA驱动程序不可用,可以通过如下JDBC资源配置实现全局事务:
• Logging Last Resource (记录最后一个资源):在此方法中,事务管理器处理并准备参与全局事务的所有XA资源管理器。然后,事务管理器将涉及非XA资源的事务分支作为本地事务处理。然后,它基于此最后一个事务分支的结果提交或回滚整个事务。
• Emulate Two-Phase Commit(仿真两阶段提交):在此方法中,非 XA资源在事务的准备阶段返回成功。然后,非XA资源尝试提交或回滚其本地事务。全局事务的最终结果不取决于非XA资源的提交或回滚操作的结果。因此,如果非XA资源的提交或回滚操作失败,将发生试探性错误。在这种情况下,参与全局事务的其它资源可能已经提交或回滚。但是,无论其它资源的状态如何,非XA资源将错误地提交或回滚。这可能会使数据处于不一致的状态。
• One-Phase Commit(一阶段提交):在此方法中,仅非 XA资源参与全局事务,且事务使用一阶段提交协议来完成。如果有多个资源尝试参与全局事务,将引发异常。
通过配置JDBC数据源以启用“记录最后一个资源”(LLR)事务优化,不仅实现允许非XA资源参与全局事务,还能得到与XA同样的ACID保证,优化应用性能。具体来说,LLR在如下方面提供性能优化:
免除了使用 XA JDBC 驱动程序连接数据库的需要。与非XA JDBC 驱动程序相比,XA JDBC驱动程序通常较为低效。
减少完成事务的处理步骤数,这还可以减少网络流量和I/O
免除了在数据库级别处理XA的需要(如果数据库是一个非XA资源)
注:2PC事务的提交记录会插入资源自身的表中,且此结果决定了全局事务准备阶段是成功还是失败。
另外,每一个服务器都具有一个事务日志,其中存储着由服务器协调的、可能尚未完成的已提交事务的相关信息。
WLS从系统崩溃或网络故障中恢复时使用事务日志。
因为事务日志记录为二进制格式,所以不能直接查看。
如果迁移到新的计算机,则必须迁移事务日志文件。