分布式事务-一致性解决方案
一、什么是分布式事务
如今的系统复杂度都较高,为了解耦,很多系统都用了微服务架构,一个服务一套独立的DB,一个业务场景一般要多个服务协调,就会在多个数据库实例执行sql,如何保证各个库的数据一致性,就是分布式事务要解决的问题。分布式事务就是来保证处理不同数据库的业务操作的原子性,要么全执行、要么都不执行。
二、常见解决方案
强一致性(数据库层面处理)
Ⅰ、XA协议两阶段提交(2PC)
角色
事务管理器:用于协调各个子事务的执行,可以由应用代码来实现或者DBproxy代理层来实现
资源管理器:管理数据库资源,一个mysql实例就是一个资源管理器
阶段一:TM向各个RM发送prepare指令,各个RM(mysql)执行子事务,加锁、改数据、写undolog、redolog(prepare)等,完成后向TM回复OK
阶段二:TM收集各个RM的回复,如果全是OK,则发送commit指令并向调用方(APP)返回ok,各个RM执行commit,redolog(commit)如果有一个RM回复不是OK,则发送rollback指令,各个RM释放资源。(无论结果如何(某个RM没有收到commit指令或者commit失败),这个事务都算完结)
存在的问题:
1、单点故障:事务管理器是一个单点,一但挂了影响整个分布式事务。(做成集群)
2、性能:各个阶段是同步阻塞的。(改异步)
3、数据一致性:如果TM与RM直线的消息由于网络故障导致部分没有收到,出现不一致,例如commit指令只有一部分TM收到了,则存在一部分不提交的子事务。(加入重试机制)
Ⅱ、三阶段提交(3PC)
最终一致性(业务逻辑层实现)
Ⅲ、补偿事务(TCC)
Ⅳ、本地事件表+消息队列
Ⅴ、MQ事务消息