`

MySQL XA事务

阅读更多

MySQL XA事务

 

MySQL从5.0.3开始支持分布式事务,当前的分布式事务只支持InnoDB存储引擎,在MySQL中,使用分布式事务的应用程序涉及一个或多个资源管理器和一个事务管理器。

 

  • 资源管理器(Resource Manager):用于提供通向事务资源的途径,数据库服务器是一种资源管理器。该资源必须可以提交或回滚由RM管理的事务,例如,多态MySQL数据库作为多态资源管理器或者几台MySQL和几台Oracle作为资源管理器。
  • 事务管理器(Transaction Manager):用于协调作为一个分布式事务的一部分的事务,TM与管理每个事务的RMs进行通信。在一个分布式事务中,各个单个事务均是分布式事务的“分支事务”。分布式事务和各分支通过一种命名方法进行标识。

 

用于执行分布式事务的过程使用两阶段提交协议,发生时间在由分布式事务的各个分支需要进行的行动已经执行之后。

  • 在第一阶段,TM告知所有RM进行prepared操作,即所有RM被告知即将要执行commit操作,通常,这意味着用于管理分支的每个RM会记录对于被稳定保存的分支的行动,然后分支回答自己是否准备好进行commit操作了。
  • 在第二阶段,TM告知所有RM进行commit或者回滚。如果在prepare时,有任一各RM回复说它无法进行commit操作,那么所有的RM将被告知进行回滚操作,否则所有的RM将被告知进行commit操作。

 

有些情况下,如果一个分布式事务只有一个RM,那么使用一阶段提交也可,即该RM会被告知同时进行prepare和commit操作。

 

XA事务语法

MySQL中与XA事务相关的SQL语句如下:

Sql代码 
  1. XA {START|BEGIN} xid [JOIN|RESUME]    #开始一个分布式事务  
  2.   
  3. XA END xid [SUSPEND [FOR MIGRATE]]  
  4.   
  5. XA PREPARE xid      # 准备提交事务  
  6.   
  7. XA COMMIT xid [ONE PHASE]   # 提交事务  
  8.   
  9. XA ROLLBACK xid   #回滚事务  
  10.   
  11. XA RECOVER [CONVERT XID]   # 查看处于PREPARE状态的事务  

 

XID标识一个分布式事务,其组成:

Java代码 
  1. xid: gtrid [, bqual [, formatID ]]  
  •  gtrid:必须,为字符串,表示全局事务标识符
  •  bqual:可选,为字符串,默认是空串,表示分支限定符
  • formatID:可选,默认值为1,用于标识由gtrid和bqual值使用的格式

 

接下来拙劣地演示下这些语句的用法:

有一个user表有两个分片,分别在3306端口和3307端口的mysql上,灰色会3306上的操作,黑色为在3307上的操作,现在要从用户user1转50给user2:




 

在两个节点上分别开启事务:

 

 

 
 进行转账操作:



 

 
准备提交:



 

 

 提交:




  结果:




 

XA事务状态(STATE)

 1. 发起XA START后,事务置于ACTIVE STATE

 2. 对于一个置于ACTIVE STATE的事务,可以发起多条SQL进行业务操作,然后发起XA END,使事务置于IDLE STATE

 3. 对于一个置于IDLE STATE的事务,你可以发起XA PREPARE 或者XA COMMIT ... ONE PHASE语句

  •  XA PREPARE置事务于PREPARE STATE,告诉MySQL准备提交事务,可以用XA RECOVER语句来查看所有处于PREPARE STATE的事务
  • XA COMMIT ... ONE PHASE告诉MySQL准备并提交(两个操作一起)事务

 4. 对于一个置于PREPARE STATE的事务,可以发起XA COMMIT操作提交事务,或者发起XA ROLLBACK操作回滚事务

 

XA事务与LOCAL事务(LOCAL事务指非分布式事务,即以start transaction开始,以commit/rollback结束的事务),是互斥的,我们不能在一个LOCAL事务中间开启一个XA事务:

 

 

反之亦然:

 

 

 问题

 之前看到书上说:MySQL的分布式事务是不完整的。如果分支事务在达到prepare状态时,数据库异常重新启动,重启后,可以继续对分支事务进行提交和回滚操作,但是提交的事务不会写入binlog,会导致:1.使用binlog恢复时丢失部分数据;2.如果存在slave,那么会导致slave和当前节点数据不一致的现象。我用5.7的MySQL试了一下,发现并不存在这个问题,主从依然能同步,不知道哪个版本开始修复了这个问题

0
1
分享到:
评论

相关推荐

    掌握分布式事务的艺术:深入MySQL XA事务处理

    ### 掌握分布式事务的艺术:深入 MySQL XA 事务处理 #### 1. 分布式事务与 XA 事务概述 ##### 1.1 分布式事务定义 分布式事务是指那些跨越多个数据库实例或者服务的事务。这类事务的管理比单一数据库上的事务更加...

    MySQL 外部XA及其在分布式事务中的应用分析

    标题《MySQL 外部XA及其在分布式事务中的应用分析》指出了文章的核心议题,即分析MySQL数据库管理系统中外部XA事务的实现机制以及它在分布式事务环境中的应用。本文将深入讨论与理解分布式事务处理原理,MySQL XA...

    mysql分布式事务实现 MySQL XA pdf

    ### MySQL分布式事务处理与XA协议详解 #### 一、引言 在当今互联网技术高度发展的背景下,分布式系统已经成为处理大规模数据的关键技术之一。而在分布式环境中,确保数据的一致性成为了非常重要的挑战。其中,...

    mysql跨库事务XA操作示例

    **开启MySQL的XA事务支持** 在MySQL中,要启用XA事务,首先需要确认`innodb_support_xa`参数是否已设置为ON。可以通过执行`SHOW VARIABLES LIKE '%XA%'`来查看。如果未开启,可以使用`SET innodb_support_xa = ON`...

    mysql的XA事务恢复过程详解

    MySQL的XA事务是分布式事务的一种实现,用于在多个数据库或者资源管理器之间协调一致性。这种事务类型遵循X/Open Distributed Transaction Processing (X/Open DTP) 标准,保证了跨多个系统的事务原子性、一致性、...

    Mysql事务控制(XA分布式事务)和锁定语句

    在分布式系统中,MySQL支持通过X/Open XA协议实现的分布式事务,这允许跨越多个资源管理器(如不同的数据库实例)的事务一致性。分布式事务的处理分为两个主要阶段: 1. **预提交阶段(Prepare Phase)**:在这一...

    sysbench-xa:从标准sysbench性能测试工具衍生而来,添加了测试用例和脚本来测试mysql XA事务处理的性能,还添加了python脚本以生成漂亮的报告网页

    如果您在非标准位置具有MySQL标头和库(并且在PATH找不到mysql_config ),则可以使用--with-mysql-includes和--with-mysql-libs选项显式指定它们./configure 。 要编译不支持MySQL的SysBench,请使用--without-...

    开源MySQL分布式中间件剖析.pptx

    4. MySQL XA事务:MySQL提供了XA事务支持,分为PREPARE和COMMIT两个阶段。在PREPARE阶段,事务状态会记录在binlog中,即使在服务故障后,仍可从binlog恢复状态,确保数据的一致性。 5. XA事务的挑战与解决方案:...

    分布式事务常用的解决方案,XA,Saga,TCC,MQ补偿.docx

    JDBC 提供了 XAConnection 和 XAResource 接口来实现XA事务。开发者可以使用这些接口来实现分布式事务的解决方案。 分布式事务解决方案有多种,选择哪种解决方案取决于具体的业务需求和系统架构。XA、Saga、TCC和MQ...

    spring hibernate mysql 事务实例

    4. 分布式事务:如果涉及多个数据库或服务,可能需要使用分布式事务解决方案,如X/Open XA或两阶段提交协议。 本实例通过Spring、Hibernate和MySQL的整合,展示了如何在实际应用中实现事务处理,保证了数据的一致性...

    基于MySQL的分布式事务的应用和缺陷.pdf

    MySQL服务器作为XA事务资源管理器,而与MySQL链接的客户端则相当于事务管理器的角色。分布式事务执行通常涉及两阶段提交,第一阶段中所有事务分支被准备提交,资源管理器记录操作并指示任务的可行性;第二阶段中事务...

    基于mysql,SpringBoot 分布式事务例子

    本文将深入探讨基于MySQL和SpringBoot的分布式事务处理,以及如何通过示例进行学习。 首先,让我们理解分布式事务的概念。分布式事务是指跨越多个数据库或应用系统的事务,确保在所有参与组件中数据的一致性和完整...

    Springboot+Atomikos+Jpa+Mysql实现JTA分布式事务

    本文将详细讲解如何利用Spring Boot、Atomikos、JPA(Java Persistence API)以及MySQL来实现JTA(Java Transaction API)分布式事务。 首先,Spring Boot是一个轻量级的框架,它简化了基于Spring的应用程序开发...

    基于MySQL和PHP的分布式事务处理.pdf

    通过XA接口,MySQL可以参与到更高级别的事务管理器中去,从而实现跨数据库系统的事务一致性。 ##### 3.2 PHP中的事务处理 PHP作为一种流行的服务器端脚本语言,可以非常方便地与MySQL进行交互。在PHP中实现分布式...

    Distributed Transaction Processing The XA Specification.pdf

    由于XA规范的存在,不同的数据库管理系统(例如MySQL XA)、编程语言中的事务API(例如Java事务API, JTA)以及事务中间件(例如Atomikos事务中间件)等可以按照这一规范实现,以确保它们能够在分布式事务环境中无缝...

    mysql索引,分布式事务,三阶段协议,b+树

    1. XA协议:MySQL遵循XA分布式事务协议,这是一个两阶段提交(2PC)的扩展,分为准备阶段和提交阶段。但在高并发场景下,2PC可能导致阻塞和数据不一致。 2. InnoDB存储引擎:提供了对分布式事务的支持,通过事务...

Global site tag (gtag.js) - Google Analytics