1 MySQL体系结构
1.1 MySQL逻辑架构
1.1.1 连接层
主要完成一些类似连接处理,授权认证及相关的安全方案
1.1.2 服务层
在MySQL据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,SQL接口,SQL解析,SQL分析优化, 缓存查询的处理以及部分内置函数执行(如日期,时间,数学运算,加密)等等。各个存储引擎提供的功能都集中在这一层,如存储过程,触发器,视图等
1.1.3 引擎层
是底层数据存取操作实现部分,由多种存储引擎共同组成。真正负责MySQL中数据的存储和提取。就像Linux众多的文件系统 一样。每个存储引擎都有自己的优点和缺陷。服务器是通过存储引擎API来与它们交互的。这个接口隐藏 了各个存储引擎不同的地方。对于查询层尽可能的透明。这个API包含了很多底层的操作。如开始一个事物,或者取出有特定主键的行。存储引擎不能解析SQL,互相之间也不能通信。仅仅是简单的响应服务器 的请求
1.1.4 存储层
将数据存储于裸设备的文件系统之上,完成与存储引擎的交互
2 MySQL存储引擎
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
2.1 关键词解释
- Engine:存储引擎
- Support:是否支持该引擎
- Transactions:是否支持事务
- XA:两阶段XA事务提交:俗称是否支持分布式事务
- Savepoints:事务结束点
2.2 XA两阶段协议
2.2.1 为什么需要XA两阶段协议?
在以前的单机Mysql实例中通过ACID来保证是没有任何问题,但是在多机器Mysql实例中如何保证ACID?
2.2.2 分布式事务
分布式事务通常采用2PC协议,全称Two Phase Commitment Protocol。该协议主要为了解决在分布式数据库场景下,所有节点间数据一致性的问题。分布式事务通过2PC协议将提交分成两个阶段:
- prepare
- commit/rollback
阶段一为准备(prepare)阶段:即所有的参与者准备执行事务并锁住需要的资源。参与者ready时,向transaction manager报告已准备就绪。
阶段二为提交阶段(commit):当transaction manager确认所有参与者都ready后,向所有参与者发送commit命令。
2.2.3 XA语法
XA {START|BEGIN} xid [JOIN|RESUME] 启动XA事务并设置为ACTIVE状态
XA END xid [SUSPEND [FOR MIGRATE]] 将活动状态的事务设置为IDLE状态
XA PREPARE xid 准备阶段
XA COMMIT xid [ONE PHASE] 提交阶段
XA ROLLBACK xid 回滚
XA RECOVER [CONVERT XID] 列出所有处于prepared状态的事务
mysql> xa recover;
+----------+--------------+--------------+--------+
| formatID | gtrid_length | bqual_length | data |
+----------+--------------+--------------+--------+
| 1 | 6 | 0 | aaabbb |
+----------+--------------+--------------+--------+
XID语法规则
xid: gtrid [, bqual [, formatID ]]
1. gtrid:全局事务ID,不得超过64,建议使用十六进制数。
2. bqual:分支限定符(branch qualifier),如果没有提供bqual,那么默认值为空字符串'',长度不超过64,建议使用十六进制数。
3. formatID:是一个无符号整数,用于标记gtrid和bqual值的格式,默认为1,长度不超过64。
注意事项
XA START
后,必须接XA END
。否则输入后续任何命令都会报错
ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state
- XA事务和本地事务以及锁表操作是互斥的。就是说开启XA事务就无法使用本地事务ACID,反之亦然。
ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global transaction is in the PREPARED state
官方文档:https://dev.mysql.com/doc/refman/8.0/en/xa-statements.html
2.3 savepoints语法
savepoint 结点名;
SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT
SET autocommit = 0;
select * from products;
# 启动事务
start transaction;
insert into products(name, price, raw_add_time) values("aaaa", 5000000, "2020-01-04 12:38:08");
# 保存事务点
savepoint x;
insert into products(name, price, raw_add_time) values("bbbb", 6000000, "2020-01-04 12:39:08");
select * from products;
# 回滚事务点,这导致: bbbb 插入后被删除
ROLLBACK TO x;
select * from products;
commit;
# RELEASE 删除事务保存点
# ROLLBACK 回滚到事务保存点