zoukankan      html  css  js  c++  java
  • 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 回滚到事务保存点
    
  • 相关阅读:
    Codeforces 934 B.A Prosperous Lot
    Codeforces 934 A.Compatible Pair
    UVA 12898
    Codeforces Round #376 (Div. 2) C. Socks bfs
    Codeforces Round #377 (Div. 2) C. Sanatorium 水题
    Codeforces Round #377 (Div. 2) D. Exams 二分
    Codeforces Beta Round #91 (Div. 1 Only) E. Lucky Array 分块
    hdu 5154 Harry and Magical Computer 拓扑排序
    Codeforces Round #272 (Div. 2) C. Dreamoon and Sums 数学
    Codeforces Round #288 (Div. 2) C. Anya and Ghosts 模拟
  • 原文地址:https://www.cnblogs.com/zhanghuizong/p/12628110.html
Copyright © 2011-2022 走看看