关于MySQL XA 事务
MySQL XA 事务通常用于分布式事务处理当中。比如在分库分表的场景下,当遇到一个用户事务跨了多个分区,需要使用XA事务 来完成整个事务的正确的提交和回滚,即保证全局事务的一致性。
XA 事务在分库分表场景的使用
下图是个典型的分库分表场景,前端是一个Proxy后面带若干个MySQL实例,每个实例是一个分区。
假设一个表test定义如下,Proxy根据主键”a”算Hash决定一条记录应该分布在哪个节点上:
create table test(a int primay key, b int) engine = innodb;
应用发到Proxy的一个事务如下:
begin;
insert into test values (1, 1);
update test set b = 1 where a = 10;
commit;
Proxy收到这个事务需要将它转成XA事务发送到后端的数据库以保证这个事务能够安全的提交或回滚,一般的Proxy的处理步骤 如下:
- Proxy先收到begin,它只需要设置一下自己的状态不需要向后端数据库发送
- 当收到 insert 语句时Proxy会解析语句,根据“a”的值计算出该条记录应该位于哪个节点上,这里假设是“分库1”
- Proxy就会向分库1上发送语句xa start ‘xid1’,开启一个XA事务,这里xid1是Proxy自动生成的一个全局事务ID;同时原来 的insert语句insert into values(1,1)也会一并发送到分库1上。
- 这时Proxy遇到了update语句,Proxy会解析 where条件主键的值来决定该条语句会被发送到哪个节点上,这里假设是“分库2”