本文内容来自《高性能MySQL》,自己整理了一下。

存储引擎的事务特性能够保证在存储引擎级别实现ACID。而分布式事务则让存储引擎级别的ACID可以扩展到数据库层面,甚至可以扩展到多个数据库之间--这需要两阶段提交实现。MySQL5.0和更新版本的数据库已经开始支持XA事务了。

XA事务中需要有一个事务协调器来保证所有的事务参与者都完成了准备工作(第一阶段)。如果协调器收到所有的参与者都准备好的消息,就会告诉所有的事务可以提交了,这是第二阶段。MySQL在这个XA事务过程中扮演一个参与者的角色,而不是协调者。

实际上,在MySQL中有两种XA事务。一方面,MySQL可以参与到外部的分布式事务中,另一方面,还可以通过XA事务来协调存储引擎和二进制日志。

内部XA事务

MySQL本身的插件式架构导致在其内部需要使用XA事务。MySQL中各个存储引擎是完全独立的,彼此不知道对方的存在,所以一个跨存储引擎的事务就需要一个外部的协调者。如果不使用XA协议,例如,跨存储引擎的事务提交就只是顺序地要求每个存储引擎各自提交。如果在某个存储提交过程中发生系统崩溃,就会破坏事务的特性(要么就全部提交,要么就不做任何操作)。如果将MySQL记录的二进制日志操作看作一个独立的“存储引擎”,就不难理解为什么即使是一个存储引擎参与的事务仍然需要XA事务了。在存储引擎提交的同时,需要将“提交”的信息写入二进制日志,这就是一个分布式事务,只不过二进制日志的参与者是MySQL本身。

XA事务为MySQL带来巨大的性能下降。从MySQL5.0开始,它破坏了MySQL内部的“批量提交”(一种通过单磁盘I/O操作完成多个事务提交的技术),使得MySQL不得不进行多次额外的fsync()调用。具体的,一个事务如果开启了二进制日志,则不仅需要对二进制日志进行持久化操作,InnoDB事务日志还需要两次日志持久化操作。换句话说,如果希望有二进制日志安全的事务实现,则至少需要做三次fsync()操作。唯一避免这个问题的办法就是关闭二进制日志,并将innodb_support_xa设置为0。

但是这样的设置是非常不安全的,而且这会导致MySQL复制也没法正常工作。复制需要二进制日志和XA事务的支持,另外--如果希望数据尽可能安全--最好还要讲sync--binlog设置为1,这时存储引擎和二进制日志才是真正同步的。(否则,XA事务支持就没有意义了,因为事务提交了二进制日志却可能没有“提交”到磁盘。)这也是为什么我们强烈建议使用带电池保护的RAID卡写缓存:这个缓存可以大大加快fsync()操作的效率。

外部XA事务

MySQL能够作为参与者完成一个外部的分布式事务。但它对XA协议支持并不完整,例如,XA协议要求在一个事务中的多个连接可以做关联,但目前的MySQL版本还不能支持。

因为通信延迟和参与者本身可能失败,所以外部XA事务比内部消耗会更大。如果在广域网中使用XA事务,通常会因为不可预测的网络性能导致事务失败。如果有太多不可控因素,例如,不稳定的网络通信或者用户长时间地等待而不提交,则最好避免使用XA事务。任何可能让事务提交发生延迟的操作代价都很大,因为它影响的不仅仅是自己本身,它还会让所有参与者都在等待。

别的方式实现分布式事务:可以在本地写入数据,并将其放入队列,然后在一个更小、更快的事务中自动分发。还可以使用MySQL本身的复制机制来发送数据。

XA事务是一种在多个服务器之间同步数据的方法。如果由于某些原因不能使用MySQL本身的复制,或者性能并不是瓶颈的时候,可以尝试使用。

MySQL分布式(XA)事务相关推荐

  1. php mysql xa_分布式事务之——MySQL对XA事务的支持

    MySQL 从5.0.3开始支持XA分布式事务,且只有InnoDB存储引擎支持.MySQL Connector/J 从5.0.0版本之后开始直接提供对XA的支持. 需要注意的是, 在DTP模型中,my ...

  2. 当MySQL执行XA事务时遭遇崩溃,且看华为云如何保障数据一致性

    摘要:当前MySQL所有版本不支持分布式事务的崩溃恢复安全,这严重影响了分布式事务的高可用保障. 华为云数据库内核高级技术专家,拥有十多年MySQL内核研发经验,目前在华为云数据库团队研发华为云数据库 ...

  3. MySQL分布式事务(XA事务)

    MySQL分布式事务(XA事务) 官网:https://dev.mysql.com/doc/refman/5.7/en/xa.html 1.什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服 ...

  4. 【分布式事务】面试官问我:MySQL中的XA事务崩溃了如何恢复??

    写在前面 前段时间搭建了一套MySQL分布式数据库集群,数据库节点有12个,用来测试各种分布式事务方案的性能和优缺点.测试MySQL XA事务时,正当测试脚本向数据库中批量插入数据时,强制服务器断电! ...

  5. 详解Mysql分布式事务XA

    在开发中,为了降低单点压力,通常会根据业务情况进行分表分库,将表分布在不同的库中(库可能分布在不同的机器上).在这种场景下,事务的提交会变得相对复杂,因为多个节点(库)的存在,可能存在部分节点提交失败 ...

  6. mysql xa 事务_MySQL的XA事务问题分析

    mysql5.7以后的版本支持了xa prepare事务的持久化,这使得基于mysql xa的分布式事务方案变的可行.但mysql目前的XA实现在极端故障场景下是会出现事务丢失或innodb数据与bi ...

  7. Mysql跨数据库事务

    跨库事务问题 在一个mysql实例中,现有A库和B库,在一个事务里同时向两库各表插入一条数据,这时就涉及一个事务跨不同库的问题 1.首先要确保mysql开启XA事务支持 SHOW VARIABLES ...

  8. mysql 内部xa_MySQL-XA事务(一)简介

    01-分布式事务处理机制DTP模型 MySQL XA事务是基于Open Group 的<> 标准来实现的,目的是为了适配分布式事务,允许多个数据库实例参与到一个全局的事务中.XA事务功能在 ...

  9. mysql对xa的支持_Mysql对XA的支持

    mysql8.0文档:https://dev.mysql.com/doc/refman/8.0/en/xa-statements.html.13.3.8.1 XA Transaction SQL Sy ...

  10. mysql事务控制(xa分布式事务)和锁定语句_MySQL的SQL语句 -事务性语句和锁定语句(7)- XA 事务...

    XA 事务 InnoDB 存储引擎支持 XA 事务.MySQL XA 的实现基于 X/Open CAE 文档 Distributed Transaction Processing: The XA Sp ...

最新文章

  1. 可持久化Trie+堆优化 OR Trie树上求XOR第K大 ---- P5283 [十二省联考2019]异或粽子
  2. python3下载教程-Python3完全零基础入门精讲 全套视频教程
  3. linux压缩命令 实例子,Linux下的tar压缩解压缩命令详解及使用实例分析
  4. linux ubuntu文件浏览器如何显示隐藏文件?(快捷键ctrl+h)
  5. 巧用组策略技术禁用办公室QQ聊天
  6. POJ 1655 Balancing Act (树的重心)
  7. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_18-异常处理-不可预知异常处理...
  8. 【java】输出素数
  9. 清华大学计算机信息学院舒教授,清华大学出计算机与信息分社.ppt
  10. 音频编辑软件有哪些?推荐几款简单的音频编辑软件
  11. win7电脑如何安装柯尼卡美能达C364e打印驱动
  12. 淘宝短视频原创检测,重复检测算法原理分析
  13. 淘宝十年数据和轶事整理
  14. css和scss设置子元素样式
  15. 【php学习之路】微信公众帐号
  16. 神策数据王晓曼:一文详解指标体系的应用与搭建
  17. Qt Q_UNUSED使用
  18. MFC打开一个文件方法汇总
  19. Android Studio之号码归属地查询(Webservice)
  20. 如何创建一个linux用户名和密码,Linux下如何创建用户 | Soo Smart!

热门文章

  1. 侧边栏php,WordPress中用于创建以及获取侧边栏的PHP函数讲解
  2. win10 cacls访问控制列表
  3. SAP 科目类型为“初级成本和收入”时,录入会计凭证时不输入成本中心
  4. IT技术岗的面试技巧分享
  5. 【Web编程实践课第一次作业】体育新闻爬虫
  6. 链接neo4j图形数据库的图像化显示(基于d3.js/neovis.js/neod3.js)
  7. 信息学奥赛一本通 1294:Charm Bracelet | OpenJudge NOI 2.6 7113:Charm Bracelet | 洛谷 P2871
  8. 《计算机视觉中的多视图几何》笔记(一)有限射影摄像机
  9. FILE *fopen
  10. 一个很全的 iOS 手机号正则表达式