MySQL8XA事务
分为 内部XA事务(单机事务) 与 外部XA事务。
内部事务与外部事务使用两套事务处理逻辑:
1.内部事务一阶段提交,执行commit记录一次binlog,同时redo落盘。 ---自己做实验看binlog日志
2.外部事务两阶段提交,执行xa perpare命令记录一次binlog落盘,但redo不落盘。 xa commit阶段记录binlog落盘,同上redo落盘|或执行xa rollback binlg记录 rollback命令,同时redo回滚。
===================================================================================
1.内部事务
1.用于mysql各个储存引擎之间,但目前只有innodb支持XA。所以不常用。
2.mysql server层binlog与innodb redo落盘。 -----内部实现了协调者的功能
server层binlog充当TM(事务管理者),innodb的redo与server层binlog充当RM(资源管理者)。
==================================================================================
2.外部事务
示例: -----内部没实现协调者功能
比如业务层面要跨oracle和mysql库同时更新每个库上表的数据,并要求两个库要么都成功,要么都失败。
语法:
XA {START|BEGIN} xid [JOIN|RESUME]
执行sql
XA END xid [SUSPEND [FOR MIGRATE]]
XA PREPARE xid
XA COMMIT xid [ONE PHASE]
XA ROLLBACK xid
XA RECOVER [CONVERT XID]
准确的说mysql并没有完全实现外部XA事务。
而是实现了充当外部xa事务的参与者(RM)的部分。
还需要代码层面实现协调者(TM)的功能。
show binary logs;
+---------------+------+----------------+-----------+-------------+------------------------------------------------------------------------------------+
| binlog.000005 | 1085 | Gtid | 1 | 1171 | SET @@SESSION.GTID_NEXT= '4eb7c907-d779-11ee-815c-000c29fefea8:128' |
| binlog.000005 | 1171 | Query | 1 | 1260 | XA START X'786964',X'',1 |
| binlog.000005 | 1260 | Table_map | 1 | 1309 | table_id: 92 (test.t3) |
| binlog.000005 | 1309 | Write_rows | 1 | 1353 | table_id: 92 flags: STMT_END_F |
| binlog.000005 | 1353 | Query | 1 | 1436 | XA END X'786964',X'',1 |
| binlog.000005 | 1436 | XA_prepare | 1 | 1475 | XA PREPARE X'786964',X'',1 |
| binlog.000005 | 1475 | Gtid | 1 | 1559 | SET @@SESSION.GTID_NEXT= '4eb7c907-d779-11ee-815c-000c29fefea8:129' |
| binlog.000005 | 1559 | Query | 1 | 1654 | XA COMMIT X'786964',X'',1 |
+---------------+------+----------------+-----------+-------------+------------------------------------------------------------------------------------+
可以看到一个事务被分为两个事务。或者说两个阶段。
==============================================================================================================================================================================================================
=======================================================================================================================================================================================================================
Mysql的XA事务分为外部XA和内部XA:
1.外部XA用于跨多MySQL实例的分布式事务,需要 应用层 作为协调者,通俗的说就是比如我们在PHP中写代码,那么PHP书写的逻辑就是协调者。
应用层负责决定提交还是回滚,崩溃时的悬挂事务。MySQL数据库外部XA可以用在分布式数据库代理层,实现对MySQL数据库的分布式事务支持,
例如开源的代理工具:网易的DDB,淘宝的TDDL等等。
2.内部XA事务用于同一实例下跨多引擎事务,由 Binlog 作为协调者,比如在一个存储引擎提交时,需要将提交信息写入二进制日志,这就是一个分布式内部XA事务,
只不过二进制日志的参与者是MySQL本身。Binlog作为内部XA的协调者,在binlog中出现的内部xid,在crash recover时,由binlog负责提交。
(这是因为,binlog不进行prepare,只进行commit,因此在binlog中出现的内部xid,一定能够保证其在底层各存储引擎中已经完成prepare)。
============================================================================================
MySQL XA事务基本语法:
XA {START|BEGIN} xid [JOIN|RESUME] 启动xid事务 (xid 必须是一个唯一值; 不支持[JOIN|RESUME]子句)
XA END xid [SUSPEND [FOR MIGRATE]] 结束xid事务 ( 不支持[SUSPEND [FOR MIGRATE]] 子句)
XA PREPARE xid 准备、预提交xid事务
XA COMMIT xid [ONE PHASE] 提交xid事务
XA ROLLBACK xid 回滚xid事务
XA RECOVER 查看处于PREPARE 阶段的所有事务
================================================================================================
PHP调用MYSQL-XA事务示例:
1、首先要确保mysql开启XA事务支持
SHOW VARIABLES LIKE '%xa%'
如果innodb_support_xa的值是ON就说明mysql已经开启对XA事务的支持了。
如果不是就执行:
SET innodb_support_xa = ON
=======php代码======