知识卡片

数据库内部分布式事务与异构XA事务的根本区别

普通读书笔记卡

内容

“分布式事务”这个笼统的说法其实指两类完全不同的东西:数据库内部的分布式事务,参与节点都运行同一套数据库软件(如VoltDB、MySQL Cluster NDB引擎的内部事务),因为不必跟任何外部系统兼容,可以自由使用专有协议、针对特定技术做深度优化,通常工作得很好;异构分布式事务,参与者由两种以上不同技术组成(不同厂商的数据库、甚至消息代理这类非数据库系统),必须用XA这样的标准协议做最小公分门。XA本质是一个连接事务协调者的C API而非网络协议,广泛被传统关系数据库和消息代理实现,能实现”消息处理恰好一次”这类跨系统集成能力(消息确认与数据库写入在同一事务内原子提交)。但正因为要兼容各种异构系统,XA无法检测跨系统死锁、无法与可串行化快照隔离这类需要跨系统定位冲突的机制协同工作,而且2PC提交需要所有参与者响应,任何一环故障都会拖垮整个事务——分布式事务因此有放大失效的倾向,这恰恰与构建容错系统的目标相悖,这也是许多云服务选择不支持异构分布式事务的直接原因。

参考来源

- 位置:《数据密集型应用系统设计》第九章《一致性与共识》"实践中的分布式事务""数据库内部的分布式事务""异构分布式事务""XA事务""分布式事务的限制"(源文件:_epub-src/ch9_split_001.html) - 结论依据:原文区分数据库内部分布式事务(同构、可自由优化)与异构分布式事务(需XA标准协议、是各系统的最小公分母),并说明XA的死锁检测缺陷及2PC放大失效的倾向,直接支撑本卡片结论。 - 原始内容:一些分布式数据库支持数据库节点之间的内部事务……在异构事务中,参与者是由两种或两种以上的不同技术组成……分布式事务又有扩大失效的趋势。