比如你在网上买了一本书,可以简化为在订单库增加订单,在库存库减掉这本书的 1 个库存。这里订单库和库存库是在不同的机器上,如果这两步放在两个事务里,增加订单这一步成功了,但是减库存这里失败了。那岂不是就乱了。
这里就要引出分布式事务了。什么是分布式事务?
1 认识分布式事务
分布式事务是指一个大的事务由很多小操作组成,小操作分布在不同的服务器上或者不同的应用程序上。分布式事务需要保证这些小操作要么全部成功,要么全部失败。MySQL 从 5.0.3 开始支持分布式事务。
分布式事务使用两阶段提交协议:
第一阶段:所有分支事务都开始准备,告诉事务管理器自己已经准备好了;
第二阶段:确定是 rollback 还是 commit,如果有一个节点不能提交,则所有节点都要回滚。
与本地事务不同点在于:分布式事务需要多一次 prepare 操作,等收到所有节点的确定信息后,再进行 commit 或者 rollback。
上面买书的例子,就可以放到一个分布式事务里,保证增加订单和减库存操作有原子性,要么全部成功,要么全部失败。
MySQL 中分布式事务按实现方式可以分为两种:MySQL 自带的分布式事务和结合中间件实现分布式事务。下面来详细介绍一下这两种分布式事务。
2 MySQL 自带的分布式事务
MySQL 有自带的分布式事务实现方法,具体语法如下:
启动分支事务:
xa start ‘a’,‘a_1’;
‘a’,‘a_1’ 表示 xid,
a 表示 gtrid,为分布式事务标识符,相同的分布式事务使用相同的 gtrid。
a_1 表示 bq