Mysql基础——事务

2020-11-21  本文已影响0人  chase_lwf

内容

一 事务

1.1 事务基本知识

1.2 事务特性如何实现的?

1.3 快照读与当前读

二 分布式事务

2.1 XA协议

分布式事务处理的XA规范如下所示:

image.png

可知XA规范中分布式事务有AP,RM,TM组成:

其中应用程序(Application Program ,简称AP):AP定义事务边界(定义事务开始和结束)并访问事务边界内的资源。

2.2 mysql基于XA实现的分布式事务

在MySQL数据库分布式事务中,MySQL是XA事务过程中的资源管理器(RM)存在的,TM是连接MySQL服务器的客户端。MySQL数据库是作为RM存在的,在分布式事务中一般会涉及到至少两个RM,所以我们说的MySQL支持XA协议是说mysql作为RM来说的,也就是说MySQL实现了XA协议中RM应该具有的功能;
MySQL中只有InnoDB引擎支持XA协议
mysql中xa事务使用的基本语法如下:


image.png

看一个基本的使用例子:

mysql> xa start '111';
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t values(1, "a");
Query OK, 1 row affected (0.00 sec)

mysql> insert into t values(2, "b");
Query OK, 1 row affected (0.00 sec)

mysql> xa end '111';
Query OK, 0 rows affected (0.00 sec)

mysql> xa prepare '111';
Query OK, 0 rows affected (0.00 sec)

mysql> xa commit '111';
Query OK, 0 rows affected (0.01 sec)

看一下binlog[row格式],start、end和commit都会产生一个query event, prepare会产生一个XA PREPARE event

log.000016 |  887 | Query          |         1 |         981 | XA START X'313131',X'',1                                              |
| binlog.000016 |  981 | Table_map      |         1 |        1036 | table_id: 345 (test.t)                                                |
| binlog.000016 | 1036 | Write_rows     |         1 |        1079 | table_id: 345 flags: STMT_END_F                                       |
| binlog.000016 | 1079 | Table_map      |         1 |        1134 | table_id: 345 (test.t)                                                |
| binlog.000016 | 1134 | Write_rows     |         1 |        1177 | table_id: 345 flags: STMT_END_F                                       |
| binlog.000016 | 1177 | Query          |         1 |        1269 | XA END X'313131',X'',1                                                |
| binlog.000016 | 1269 | XA_prepare     |         1 |        1308 | XA PREPARE X'313131',X'',1                                            |
| binlog.000016 | 1308 | Gtid           |         1 |        1385 | SET @@SESSION.GTID_NEXT= '38c9a80a-ac85-11ea-8fbf-0242c0a80a02:28'    |
| binlog.000016 | 1385 | Query          |         1 |        1480 | XA COMMIT X'313131',X'',1   
  1. 当xa start开启事务后,DML也会在对应的RM上创建undo以及read view。
  2. 当xa prepare 时会将子事务置于PREPARED状态,此时子事务已经完成事务提交前的所有准备工作(获得锁,并将PREPARED状态记录到共享表空间中,会将xa start到xa end之间操作记录在binlog中)。
  3. 当xa commit 时会在binlog中记录xa commit xid, 并将innodb中PREPARED状态转化为COMMITED状态。
  4. 当xa commit one phase 时会同时进行prepare和commit 两种操作,是在TM发现全局的分布式事务只涉及一个RM时进行的(因为不需要等待其他RM的反馈结果)。
  5. 当xa rollback在xa prepare前时,因为没有写binlog和redo,只会释放undo, read view以及lock。
  6. 当xa rollback 在xa prepare之后时,除了需要释放undo, read view以及lock,还需要binlog中记录xa rollback xid(使得从库不会提交该事务)以及innodb中将PREPARED状态转化为ROLLBACK状态。

2.3 mysql如何保证数据不丢失?

总的来说,MySQL是通过binlog和redo log两者来保证数据不丢失的,mysql 采用WAL的机制,内部也通过两阶段提交(内部XA)来保证binlog和redo log的写入一直性,看一下两阶段提交流程图:


image.png

在回顾一下更新数据的基本流程:

问题:如果在时刻B时,即已经把写入binlog了,但是在更改状态为commit时,数据库crash了,崩溃恢复时如何处理?
mysql是这样处理的:

问题二:MySQL 怎么知道 binlog 是完整的?

引用:

上一篇下一篇

猜你喜欢

热点阅读