1.主动学习
全局事务与共享事务
全局事务(Global Transactions)
共享事务(Share Transactions)
XA 协议
为了解决分布式事务的一致性问题,而提出的事务处理框架
XA 接口是双向的,是一个事务管理器和多个资源管理器之间通信的桥梁,通过协调多个数据源的动作保持一致,来实现全局事务的统一提交或者统一回滚。现在,我们在 Java 代码中还偶尔能看见的 XADataSource、XAResource 等名字,其实都是源于 XA 接口。
两段式提交
1:需要有两个前提条件
第一,必须假设网络在提交阶段这个短时间内是可靠的,即提交阶段不会丢失消息。同时也假设网络通讯在全过程都不会出现误差,即可以丢失后消息,但不会传递错误的消息,XA 的设计目标并不是解决诸如拜占庭将军一类的问题。
两段式提交中投票阶段
第二,必须假设因为网络分区、机器崩溃或者其他原因而导致失联的节点最终能够恢复,不会永久性地处于失联状态。由于在准备阶段已经写入了完整的重做日志,所以当失联机器一旦恢复,就能够从日志中找出已准备妥当但并未提交的事务数据,再向协调者查询该事务的状态,确定下一步应该进行提交还是回滚操作。
2:角色有协调者 参与者
两阶段提交的缺点 1: 单点问题,协调者是单点的,协调者出现故障,参与方都只能永远等待 2: 性能问题,要经过准备个确定两个阶段,并且整个时间耗时取决于最慢的那个服务,所以整体性能不高 3:一致性风险,一致性无法保证
三段式提交
三段式提交把原本的两段式提交的准备阶段再细分为两个阶段,分别称为 CanCommit、PreCommit,把提交阶段改为 DoCommit 阶段。其中,新增的 CanCommit 是一个询问阶段,协调者让每个参与的数据库根据自身状态,评估该事务是否有可能顺利完成。
三阶段提交主要是减少了有参与者需要回滚时,整体过程中其他参与者在做准备时的性能浪费,在有了询问阶段后,如果有没准备好的参与者,则所有参与者都不需要进行准备工作(准备工作比较重负载)。但是在所有参与者都可以正常提交时,因为多了一次网络交互,反而性能更差。
在三段式提交中,如果协调者在 PreCommit 阶段开始之后发生了宕机,参与者没有能等到 DoCommit 的消息的话,默认的操作策略将是提交事务而不是回滚事务或者持续等待。你看,这就相当于避免了协调者的单点问题。
共享事务
备注
摘自极客时间 - 周志明老师的公开课《周志明的软件架构课》 <- 极其推荐大家阅读~>
2. 写在最后
事务演进
本地事务:单服务单数据源,ACID,强一致性
全局事务:单服务多数据源,XA协议,多数据源的强一致性,两阶段提交(2PC)和三阶段提交(3PC)
共享事务:多服务单数据源,即多个服务共用同一个数据源
分布式事务:多服务多数据源