LXX的网络日志
人因梦想而伟大
笔记-XA规范于2PC协议

XA规范

有个叫X/Open的组织定义了分布式事务的模型,有几个角色,就是AP(Application,应用程序),TM(Transaction Manager,事务管理器),RM(Resource Manager,资源管理器),CRM(Communication Resource Manager,通信资源管理器)。

有一个概念,叫全局事务,一个横跨了多个数据库的事务。就是一个事务里,设计了多个数据库的操作,然后要保证多个数据库中,任何一个操作失败了,其他所有库的操作全部回滚,这就是所谓的分布式事务。

上面这套东西就是所谓X/Open组织搞得一个分布式事务模型。XA呢,就是定义好了TM于RM之间的接口规范,就是管理分布式事务的那个组件跟各个数据库之间通信的一个接口。

比如管理分布式事务的组件,TM就会根据XA定义的接口规范,跟各个数据库通信和交互,告诉大家,一起回滚或者提交事务,大概是这个意思。

XA仅仅是一个规范,具体的实现是数据库厂商来提供的,比如说MySQL就会提供XA规范的接口函数和类实现等等。

xa.png

2PC理论

X/Open组织定义的一套分布式事务的模型。

2PC(Two-Phase-Commitment-Protocol)就是基于XA规范搞的一套分布式事务的理论,也可以叫一套规范或者协议。

2PC也就是两阶段事务。

(1)准备阶段

在准备阶段,TM先发送prepare消息给各个数据库,让各个库先把分布式事务里面要执行的各种操作,先准备执行,其实此时各个库会差不多先执行好,就是不提交。

执行完了之后,各个数据库都返回一个响应消息给事务管理器,如果成功了就发送一个成功的消息,如果失败了就发送一个失败的消息。

prepare.png

(2)提交阶段

某个数据库告诉TM,SQL执行失败了,或者某个数据库一直不发送响应消息给TM,也不知道是成功还是失败,也就是超时。这种情况下只要TM发现有任何一个库告诉它SQL执行失败了,或者超时了没有返回响应消息,TM就会认为整个分布式事务就是失败了。

一旦失败了,TM就会去发送消息,通知各个数据库进行回滚操作。如果所有库都回滚成功,那么分布式事务回滚。

如果所有库都成功了,那么TM就会去发送消息,通知所有库都去提交事务。提交成功后,所有库都会发送一个消息给TM告诉它成功了,如果都提交成功了,那么此次分布式事务就算成功了。