MySQL高级特性之分布式(XA)事务的介绍
文章目录
- 分布式(XA) 事务
- 1、内部XA事务
- 2、外部XA事务
这一部分是 高性能MySQL(第3版)中第七章第11节内容:关于MySQL高级特性之分布式(XA)事务的介绍,(不感兴趣的可以忽略)
分布式(XA) 事务
存储引擎的事务特性能够保证在存储引擎级别实现ACID (参考前面介绍的“事务”的四大特性:原子性,一致性,隔离性,持久性),而分布式事务则让存储引擎级别的ACID可以扩展到数据库层面,甚至可以扩展到多个数据库之间一这需要通过两阶段提交实现。MySQL5.0和更新版本的数据库已经开始支持XA事务了。
XA事务中需要有一个事务协调器来保证所有的事务参与者都完成了准备工作(第一阶段)。如果协调器收到所有的参与者都准备好的消息,就会告诉所有的事务可以提交了,这是第二阶段。MySQL在这个XA事务过程中扮演一个参与者的角色,而不是协调者。
实际上,在MySQL中有两种XA事务。一方面,MySQL可以参与到外部的分布式事务中;另一方面,还可以通过XA事务来协调存储引擎和二进制日志。
1、内部XA事务
MySQL本身的插件式架构导致在其内部需要使用XA事务。MySQL中各个存储引擎是完全独立的,彼此不知道对方的存在,所以一个跨存储引擎的事务就需要一个外部的协调者。如果不使用XA协议,例如,跨存储引擎的事务提交就只是顺序地要求每个存储引擎各自提交。如果在某个存储提交过程中发生系统崩溃,就会破坏事务的特性(要么就全部提交,要么就不做任何操作)。
如果将MySQL记录的二进制日志操作看作一个独立的“存储引擎”,就不难理解为什么即使是一个存储引擎参与的事务仍然需要XA事务了。在存储引擎提交的同时,需要将“提交”的信息写入二进制日志,这就是一个分布式事务,只不过二进制日志的参与者是MySQL本身。
XA事务为MySQL带来巨大的性能下降。从MySQL5.0开始,它破坏了MySQL内部的“批量提交”(一种通过单磁盘I/O操作完成多个事务提交的技术),使得MySQL不得不进行多次额外的fsync()调用(注15:在撰写 本书的时候,“批量提交“ 的问题已经有了很多解决方案,其中至少有三种是很优秀的。还需要进一步观察到底MySQL官方会采用哪一种,到底到哪个版本MySQL才会合并到源码。目前,使用MariaDB和Percona Server就可以避免这个问题)。
具体的,一个事务如果开启了二进制日志,则不仅需要对二进制日志进行持久化操作, InnoDB事务日志还需要两次日志持久化操作。换句话说,如果希望有二进制日志安全的事务实现,则至少需要做三次fsync()操作。唯一避免这个问题的办法就是关闭二进制日志,并将innodb_ support_ xa 设置为0(注16:一个常见的误区是认为innodb_support_xa只有在需要XA事务时才需要打开。这是错误的:该参数还会控制MyQSL内部存储引擎和二进制日志之间的分布式事务。如果你真正关心你的数据,你需要将这个参数打开)。
但这样的设置是非常不安全的,而且这会导致MySQL复制也没法正常工作。复制需要二进制日志和XA事务的支持,另外一-如果希望数据尽可能安全一.最好还要将sync_ binlog 设置成1,这时存储引擎和二进制日志才是真正同步的。(否则,XA事务支持就没有意义了,因为事务提交了二进制日志却可能没有“提交”到磁盘.)这也是为什么我们强烈建议使用带电池保护的RAID卡写缓存:这个缓存可以大大加快fsync()操作的效率。
下一章我们将更进一步地介绍如何配置事务日志和二进制日志。
2、外部XA事务
MySQL能够作为参与者完成一个外部的分布式事务。但它对XA协议支持并不完整,例如,XA协议要求在一个事务中的多个连接可以做关联,但目前的MySQL版本还不能支持。
因为通信延迟和参与者本身可能失败,所以外部XA事务比内部消耗会更大。如果在广域网中使用XA事务,通常会因为不可预测的网络性能导致事务失败。如果有太多不可控因素,例如,不稳定的网络通信或者用户长时间地等待而不提交,则最好避免使用XA事务。任何可能让事务提交发生延迟的操作代价都很大,因为它影响的不仅仅是自己本身,它还会让所有参与者都在等待。
通常,还可以使用别的方式实现高性能的分布式事务。例如,可以在本地写入数据,并将其放入队列,然后在一个更小、更快的事务中自动分发。还可以使用MySQL本身的复制机制来发送数据。我们看到很多应用程序都可以完全避免使用分布式事务。
也就是说,XA事务是一种在多个服务器之间同步数据的方法。如果由于某些原因不能使用MySQL本身的复制,或者性能并不是瓶颈的时候,可以尝试使用。
MySQL高级特性之分布式(XA)事务的介绍相关推荐
- MySQL高级特性 读书笔记
MySQL高级特性 1. 分区表 对于用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成.实现分区的代码实际上是对一组底层表的句柄对象的封装 以下场景分区表可以起到非常大的作用: 1. 表 ...
- 尚硅谷《MySQL高级特性篇》教程发布
MySQL底层如何组织设计数据 怎么理解"索引即数据,数据即索引" 海量数据和高并发场景下如何设计主键 索引下推.覆盖索引对优化有什么优势 如何保证主从一致性 MVCC如何解决可重 ...
- Redis 高级特性(1)—— 事务 过期时间 排序
1. Redis 高级特性 -- 事务 事务概念 Redis 中的事务 (transaction)是一组命令的集合.事务同命令一样是 Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执 ...
- MySQL高级特性一:分区表
对用户来说,分区表时一个独立的罗技表,但是底层由多个无力字表组成.实现分区的代码实际上是对一组底层表的句柄对象的封装.对分区表的请求,都会通过句柄对象转化成对存储引擎的接口调用.所以分区对于SQL层来 ...
- MySQL高级特性之分区表
对于用户而言,分区表是一个独立的逻辑表,但是在底层由多个物理子表组成.实现分区的代码实际上是对一组底层表的句柄对象的封装,对分区表的请求都会通过句柄对象转化成对存储引擎的接口调用 意义 MySQL在创 ...
- MySQL分布式事务(XA事务)
MySQL分布式事务(XA事务) 官网:https://dev.mysql.com/doc/refman/5.7/en/xa.html 1.什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服 ...
- mysql 事务sqlserver_MYSQL高级特性 -- 事务处理_sqlserver
下面以两个银行账户之间的转账为例子进行演示. 要使用mysql中的事务处理,首先需要创建使用事务表类型(如BDB = Berkeley DB或InnoDB)的表. CREATE TABLE accou ...
- 高性能mysql学习笔记--高级特性
高性能mysql 七:高级特性 1,分区表 分区表是一个独立的逻辑表,但是底层由多个无力字表组成,实现分区的代码实际上是对一组地层表的句柄对象的封装,对分区表的请求,都会通过句柄对象转化成对储存引擎的 ...
- MySQL数据库教程天花板,mysql安装到mysql高级,强|硬
MySQL数据库笔记 第一部分 MySQL基础篇 第01章 数据库概述 1. 为什么要使用数据库 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业 ...
最新文章
- arXiv爆款:想了解Attention就看它!清华计图胡事民团队出品
- PAT (Advanced Level) 1035. Password (20)
- python字符串解释_python基础之字符串详解
- LeetCode 341. 扁平化嵌套列表迭代器(双栈)
- java开发,年薪15W的和年薪50W的差距
- 殷浩详解DDD:领域层设计规范
- 一款漂亮的赞助打赏单页界面美化版源码
- 【[USACO09DEC]牛收费路径Cow Toll Paths】
- CF1152 F. Neko Rules the Catniverse (dp)
- Dev-cpp5.4.0安装及下载
- php 写聊天室源码,php写的简易聊天室代码
- goodnote笔记同步 Android,goodnotes笔记
- 无处安放的野心和能力
- GPS是如何定位的?
- 10 分钟把你的 Web 应用转为桌面端应用
- 湖南大学计算机学院陈浩,杨圣洪-湖大信息科学与工程学院
- 计算机组装原则与注意事项,计算机安装流程和注意事项
- 【游戏】任天堂Nintendo Switch超详细购买/使用指南以及注意事项(根据自己使用持续更新中...)
- AAM(Active Appreance Model)算法用于人脸识别总结
- 联想小娜怎么开启_联想小新Air 14win10系统的微软小娜如何开启