MySQL体系结构学习

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。

注意事项

  1. XA START后,必须接XA END。否则输入后续任何命令都会报错

ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state

  1. 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 回滚到事务保存点

猜你喜欢

转载自www.cnblogs.com/zhanghuizong/p/12628110.html