目录
一、什么是分布式
目前的数据库仅支持单库事务,并不支持跨库事务;而微服务架构则是将一个大型系统往往由若干个子系统构成,每个子系统都有单独的数据库,有些业务需要在多个子系统中共同执行,可能还需要在同一个事务中完成;这种需要解决跨数据库的事务就是分布式事务。
二、两段提交(2PC)
2PC两段提交是基于XA协议的方案,其引入了协调者,并分为两个阶段执行:第一阶段(投票阶段)和第二阶段(提交执行阶段)。
第一个阶段:协调者节点向所有参与者询问能否提交,并等待每个参与者的消息反馈。
第二个阶段:当协调者收到所有参与者反馈的消息为可以提交时,那么则提交事务;协调者在第一阶段的询问超时之前无法获取所有参与者节点的响应消息时,则执行回滚事务。
缺点:若在第二阶段,突然断网,协调者只发送了部分commit,那么就会出现数据不一致问题。同步阻塞问题(所有事务参与者在等待其它参与者响应的时候都处于同步阻塞状态,无法进行其它操作)。锁定资源时间长,对性能影响很大。
三、补偿事务(TCC)
TCC补偿事务属于两段提交的一种改进,其将业务逻辑分成了Try、Confirm、Cancel三个操作,Try部分完成业务的准备工作,confirm部分完成业务的提交(只要Try成功,Confirm一定成功),cancel部分完成事务的回滚(执行的业务取消,预留资源释放)。
使用范围:具有较强隔离性,严格一致性要求的业务活动或者执行时间较短的业务。如处理账户或者收费等等。
优点: 和2PC相比,虽然数据的一致性要差一些,但是实现以及流程相对简单。
缺点: confirm和cancel有可能失败。
四、本地消息表
本地消息表与业务数据表处于同一个数据库中,利用本地事务来保证在对这两个表的操作满足事务特性,并且使用了消息队列来保证最终一致性。
1、写业务数据的操作之后并向本地消息表发送消息,本地事务能保证这个消息一定会被写入本地消息表中;
2、将本地消息表中的消息转发到 rocketMQ等消息队列中,若成功则将删除消息,否则继续重新转发。
3、在分布式事务操作的另一方从消息队列中读取一个消息,并执行消息中的操作。