Mysql数据库分布式事务XA详解

XA事务简介

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

mysql 的XA事务分为内部XA和外部XA。 外部XA可以参与到外部的分布式事务中,需要应用层介入作为协调者;内部XA事务用于同一实例下跨多引擎事务,由Binlog作为协调者,比如在一个存储引擎提交时,需要将提交信息写入二进制日志,这就是一个分布式内部XA事务,只不过二进制日志的参与者是MySQL本身。 Mysql 在XA事务中扮演的是一个参与者的角色,而不是协调者。

MySQL XA 事务基本语法

XA {START|BEGIN} xid [JOIN|RESUME]     启动一个XA事务 (xid 必须是一个唯一值; [JOIN|RESUME]  字句不被支持)

XA END xid [SUSPEND [FOR MIGRATE]]   结束一个XA事务 ( [SUSPEND [FOR MIGRATE]] 字句不被支持)

XA PREPARE xid    准备

XA COMMIT xid [ONE PHASE]    提交XA事务

XA ROLLBACK xid  回滚XA事务

XA RECOVER   查看处于PREPARE 阶段的所有XA事务

事务标识符xid

xid 是一个事务标识符,它由客户端提供或者有mysql服务器生成。

xid的格式一般为 xid : gtrid [, bqual [, formatID]] ;gtrid是一个全局事务标识符,bqual是一个分支限定符,formatID是一个数字,用于标识由gtrid和bqual值使用的格式。根据语法的表示,bqual和formatID是自选的。如果没有给定,默认的bqual值是‘‘。如果没有给定,默认的fromatID值是1。

XA事务状态进展过程

1. 使用XA START 启动一个XA事务,并把它置为ACTIVE状态。

2. 对一个ACTIVE XA事务,发布构成事务的SQL语句,然后发布一个XA END 语句,XA END 把事务置为IDLE状态。

3. 对一个IDLE XA 事务, 发布一个XA PREPARE语句或者一个XA COMMIT ... ONE PHASE语句: 前者把事务置为PREPARE状态,此时XA RECOVER 语句的输出包含事务的xid值(XA RECOVER 语句会列出所有处于PREPARE状态的XA事务); 后者用于预备和提交事务,不会被XA RECOVER列出,因为事务已经终止。

4. 对一个PREPARE XA 事务,可以发布一个XA COMMIT语句来提交和终止事务,或者发布一个XA ROLLBACK 来回滚并终止事务。

简单的XA事务操作流程

[plain] view plain copy

print?

  1. mysql> XA START ‘xatest‘;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> INSERT INTO test (name,tel) VALUES (‘123‘,‘123‘);
  4. Query OK, 1 row affected (0.00 sec)
  5. mysql> XA END ‘xatest‘;
  6. Query OK, 0 rows affected (0.00 sec)
  7. mysql> XA PREPARE ‘xatest‘;
  8. Query OK, 0 rows affected (0.00 sec)
  9. mysql>
  10. mysql>
  11. mysql> XA COMMIT ‘xatest‘;
  12. Query OK, 0 rows affected (0.00 sec)

XA RECOVER 介绍

XA RECOVER 列出所有处于PREPARE状态的XA事务:

[python] view plain copy

print?

  1. mysql> XA RECOVER;
  2. +----------+--------------+--------------+--------+
  3. | formatID | gtrid_length | bqual_length | data   |
  4. +----------+--------------+--------------+--------+
  5. |        1 |            6 |            0 | xa1000 |
  6. +----------+--------------+--------------+--------+
  7. 1 row in set (0.00 sec)

注释:

1. formatID 是事务xid的formatID部分。

2. gtrid_length 是xid的gtrid部分的长度,以字节为单位。

3. bqual_length 是xid的bqual部分的长度,以字节为单位。

4. data 是xid的gtrid部分和bqual部分的串联。

在用一个客户端环境下,XA事务和本地(非XA)事务互相排斥,如果已经发布了XA START来开启一个事务,则本地事务不会被启动,知道XA事务被提交或者被回滚为止;相反的,如果已经使用START TRANSACTION启动一个本地事务,则XA语句不能被使用,直到该事务被提交或者回滚为止,而且XA事务仅仅被InnoDB存储引擎支持。

如果XA事务达到PREPARE状态时MySQL服务器宕机,当服务器重启后,服务器会回滚任何未完成的XA事务,即使该事务已经达到了PREPARE状态;如果客户端连接终止,而服务器继续运行,服务器将回滚任何未完成的XA事务,即使该事务已经达到PREPARED状态。

时间: 2024-12-29 23:25:53

Mysql数据库分布式事务XA详解的相关文章

Mysql数据库配置文件my.cnf详解

basedir = path 使用给定目录作为根目录(安装目录). character-sets-dir = path 给出存放着字符集的目录. datadir = path 从给定目录读取数据库文件. pid-file = filename 为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); Init-V脚本需要使用这个文件里的进程ID结束mysqld进程. socket = filename 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(仅适用

MYSQL数据库配置文件与权限详解

"1" MYSQL配置文件常用参数说明:bind-address:MYSQL实例启动后绑定的IPport : MYSQL实例启动后监听的端口socket: 本地SOCKET方式登录MYSQL时SOCKET文件路径datadir: MYSQL数据库相关的数据文件主目录tmpdir : MYSQL保存临时文件的路径skip-external-locking:跳过外部锁定back_log: 在MYSQL的连接请求等待队列中允许存放的最大连接数character-set-server:MYSQ

Mysql数据库表分区深入详解

0.mysql数据库分区的由来? 1)传统不分区数据库痛点 mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看), 一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放表数据的,一个是myi存表索引的. [[email protected] test]# ls -al 总用量 1811444 drwx------ 2 mysql mysql 4096 10月 17 15:12 . drwxr-xr-

MySQL数据库安装与配置详解

目录 一.概述 二.MySQL安装 三.安装成功验证 四.NavicatforMySQL下载及使用 一.概述 MySQL版本:5.7.17 下载地址:http://rj.baidu.com/soft/detail/12585.html?ald 客户端工具:NavicatforMySQL 绿色版下载地址:http://www.cr173.com/soft/38153.html  二.MySQL安装 安装条件: 1).net framework4.0(下载地址:http://rj.baidu.com

mysql数据库explain命令用法详解

本文转自一位前辈的文章,感觉写得很好,就转过来了.这个是那位前辈的原文地址:http://www.111cn.net/database/mysql/81698.htm 当我们在优化SQL时,想看看自己写的SQL的执行效率问题,MySql给我们提供一个命令explain,可以显示我们所写的SQL效率. 一个常见的理解错误:mysql在执行explain时不会执行sql语句,事实上如果查询的from字段有子查询,explain会执行子查询. explain只能解释select查询,对update,d

Net Core中数据库事务隔离详解——以Dapper和Mysql为例

Net Core中数据库事务隔离详解--以Dapper和Mysql为例 事务隔离级别 准备工作 Read uncommitted 读未提交 Read committed 读取提交内容 Repeatable read (可重读) Serializable 序列化 总结 事务隔离级别 .NET Core中的IDbConnection接口提供了BeginTransaction方法作为执行事务,BeginTransaction方法提供了两个重载,一个不需要参数BeginTransaction()默认事务

图解MYSQL JOIN ON,SQL JOIN 详解,数据库sql join语句

对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn diagrams 解释了SQL的Join.我觉得清楚易懂,转过来. 假设我们有两张表. Table A 是左边的表. Table B 是右边的表. 其各有四条记录,其中有两条记录是相同的,如下所示

MYSQL之数据库初识、安装详解、sql语句基本操作

目录 MYSQL之数据库初识及安装详解 1.什么是数据库? 1.什么是数据?(data) 2.什么是数据库?(databases,简称DB) 2.为什要用数据库? 3.什么是数据库管理系统?(DataBase Management System 简称DBMS) 4.数据库管理软件的分类 5.MYSQL数据库 6.数据库服务器.数据管理系统.数据库.表记录之间的关系 MYSQL的安装 下载及启动 配置环境变量及作系统服务 修改密码 破解密码 配置文件 数据库的基本操作 MYSQL之数据库初识及安装

MySQL 删除数据库:数据库的删除方法详解

MySQL 删除数据库 使用普通用户登陆 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库,所以我们这边使用 root 用户登录,root 用户拥有最高权限. 在删除数据库过程中,务必要十分谨慎,因为在执行删除命令后,所有数据将会消失. drop 命令删除数据库 drop 命令格式: drop database <数据库名>; 例如删除名为 RUNOOB 的数据库: mysql> drop database RUNOOB; 使用 mysqladmin 删除数据库