当前innodb 支持分布式事务。 一个分布式事务包括多个行动, 而这些行动本身又是一个事务。 这些行动要么一起成功, 要么一起回滚。
一个分布式事务中的单个事务 又叫做 “分支事务”
分支事务作为原子操作, 要么全部提交, 要么全部回滚。
个人对分布式事务概念的理解:一个事务里面是sql语句集合, 而分布式事务的里面是 事务。 分布式事务是 事务的集合。 图解如下, 如果我的理解错误欢迎指正。
资源管理器(RM): 数据库服务器就是一种资源管理器。
事务管理器(TM): 协调分支事务。 TM与管理每个事务的RM进行通信。
mysql 执行 XA MYSQL (比如 xa start 'test','db1'; )的时候, 那么该服务器相当于XA事务的资源管理器。 与mysql 服务器相连的客户端相当于一个事务管理器
分布式事务的语法
启动一个分布式事务
XA START xid
xid 分布式事务的唯一标识符。 由客户端或者服务器生成。
xid组成: gtrid [,bqual [, formatID]] 比如 ‘test,db01’
gtrid ; 分布式事务的标识符, 相同的分布式事务用同一个gtrid
bqual : 标识分支事务。 对同一个分布式事务中的分支事务, 它们必须是唯一的。
formatID: 是一个数字, 用于表示 gtrid 和 bqual 使用的格式。 默认是 1
使得事务进入PREPARE 状态
XA END xid [SUSPEND [FOR MIGRATE]]
XA PREPARE xid
提交具体的分支事务
XA COMMIT xid [ONE PHASE]
回滚具体的分支事务
XA ROLLBACK xid
返回当前数据库中处于PREPARE 状态的分支事务的详细信息。
XA RECOVER
存在的问题
事务在prepare 状态的时候并没有写入到binlog 中。
如果分支事务达到 prepare 状态的时候, 此时数据库异常重新启动之后, 依然可以对分支事务进行提交或者回滚, 但是提交后事务是不会写到binlog 的, 此时会导致主从复制不一致了