XA 事务

264 阅读5分钟

前言

当你的业务越发复杂,比如同一个事务中,涉及到多个数据源的数据操作,而传统数据库事务并不支持跨数据源的事务;这个时候,分布式事务登场了。

XA 事务主要适用于跨多个资源管理器(如不同的数据库等数据源)的分布式事务场景,XA 定义的是一种标准,不同的数据库厂商有不同的实现。

分布式事务要解决的核心问题是,确保多个资源端的一致性和完整性,而这些资源可能跨库、跨应用,当然也可能分布在不同的地域。

那如何来保障呢?

由于资源、网络等都可能出现在事务执行中,部分成功部分失败的中断,要么执行成功的操作进行回滚,要么执行失败的操作进行重试,从而保障各方资源的一致性和完整性。

而为了减少这种回滚的概率,我们可以预先检查资源和锁定资源,当各方资源都确定无误的情况下,再进行对各方资源的统一提交。

到这,其实就有了两阶段提交的意思了。

而 XA 则是一种分布式事务的标准,在各家厂商的实现中,自然也可以利用两阶段提交来实现。

XA 事务

什么是 XA

XA 是 “eXtended Architecture” 的缩写,即扩展架构。

XA 事务模型是 X/Open 组织定义的一种分布式事务处理模型,通过定义事务管理器、资源管理器等组件之间的接口,来实现对分布式事务的管理和协调,以保证在分布式环境下数据的一致性和完整性。

XA 是定义的标准,而实现方可以是各类数据库、应用服务等;比如 MySQL InnoDB、PostgreSQL 等数据库支持 XA 事务。

基本概念

  • 资源管理器(RM) :负责管理具体的资源,像数据库、消息队列等。资源管理器能够对资源进行操作,例如执行 SQL 语句、发送消息等。
  • 事务管理器(TM) :负责协调多个资源管理器,确保所有参与事务的资源管理器要么全部成功提交事务,要么全部回滚。事务管理器掌控着整个分布式事务的生命周期。
  • 应用程序(AP) :发起事务的程序,它会向事务管理器请求开始一个分布式事务,并且在事务中对多个资源管理器进行操作。

工作原理

XA 事务采用 两阶段提交协议(Two-Phase Commit,2PC)来保证事务的原子性,两阶段分别是准备阶段和提交阶段。

准备阶段(Prepare Phase)

  1. 应用程序向事务管理器发起一个分布式事务请求。
  2. 事务管理器通知所有参与事务的资源管理器准备提交事务。
  3. 每个资源管理器执行本地事务操作,将操作结果记录在本地日志中,并向事务管理器反馈是否可以提交事务。

提交阶段(Commit Phase)

  • 全部同意提交:若所有资源管理器都反馈可以提交事务,事务管理器会通知所有资源管理器正式提交事务。
  • 存在拒绝提交:要是有任何一个资源管理器反馈无法提交事务,事务管理器就会通知所有资源管理器回滚事务。

典型示例

假设有一个分布式系统,包含两个数据库(DB1 和 DB2),应用程序需要在这两个数据库上同时执行更新操作,以保证数据的一致性。此时可以使用 XA 事务来实现:

  1. 应用程序向事务管理器发起一个分布式事务请求。
  2. 事务管理器通知 DB1 和 DB2 准备提交事务。
  3. DB1 和 DB2 分别执行本地的更新操作,并将操作结果记录在本地日志中,然后向事务管理器反馈是否可以提交事务。
  4. 若 DB1 和 DB2 都反馈可以提交事务,事务管理器通知它们正式提交事务;若有任何一个数据库反馈无法提交事务,事务管理器通知它们回滚事务。

优缺点

  • 优点:XA 事务能够确保分布式系统中数据的强一致性,在多个资源管理器之间实现事务的原子性。
  • 缺点:两阶段提交协议存在性能问题,因为在准备阶段和提交阶段都需要进行多次消息交互,会增加系统的响应时间。此外,该协议还存在单点故障问题,若事务管理器出现故障,可能会导致整个分布式事务无法正常完成。

小结

XA 是定义的一种标准,市面上有很多数据库厂商都有实现。

XA 事务是一种强一致性的分布式事务,使用相对简单,无需额外的补偿逻辑,在一些强一致性的金融场景下经常使用。

而缺点也比较明显,性能开销大,涉及多次资源锁定和协调,长时间占用资源,可能导致系统吞吐量下降等。