分布式事务主要包括2pc、3pc、消息事务。
2pc的具体实现有AT、XA、TCC、Sata。
3pc解决了2pc一阶段资源无效锁定的问题。
消息事务是最终一致性方案。总之,分布式事务没有最好的方案,需要根据场景选择最合适的方案。
成员类型包括事务参与者和事务协调者,分为准备-提交/撤销两个阶段。
缺点:
- 事务存在同步阻塞的问题;因为事务协调器需要等待全部参与者均返回响应后,才执行提交/回滚操作;
- 第一阶段锁定资源,可能会造成资源浪费;因为有些事务在大部分参与者上能执行,但在某个参与者上无法执行,会导致大部分参与者锁定资源,导致浪费。
2PC的具体实现,利用数据库实现事务的提交和回滚。
缺点:拥有2PC的全部缺点。
2PC的具体实现,准备阶段直接会提交事务,利用日志记录待操作的原始数据记录的镜像,利用镜像去执行撤销操作,相较于XA同步阻塞的时间更短了。
2PC的具体实现,由业务代码实现资源锁定和事务的提交、回滚操作,分为Try-Confirm/Cancel。
缺点:
- 在第二阶段会存在部分参与者confirm/cancel失败的情况,需要参与机制确保其至少执行一次。例如使用轮询加幂等性的方法。
- 空回滚问题:例如在第一阶段try时,由于网络问题参与者a未收到try请求,协调器会发生cancel命令,此时参与者a在未收到try时,就已经收到cancel了,造成空回滚。
2pc具体实现,长事务的解决方案,和AT有点像,区别在于saga是通过执行补偿业务去完成回滚。
缺点:
- 存在脏写;
- 事务完成执行的时间不确定。
成员类型包括事务参与者和事务协调者,分为询问-准备-提交/撤销三个阶段;解决了2PC资源浪费的问题。
还是存在事务同步阻塞的问题。
用消息队列去实现分布式事务。
缺点:
- 下游消费者的事务若无法执行,没办法回滚上游生产者的事务,从而导致数据状态不一致;