分布式事务-一致性解决方案

一、什么是分布式事务

如今的系统复杂度都较高,为了解耦,很多系统都用了微服务架构,一个服务一套独立的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事务消息

posted @ 2022-04-04 22:46  hugeQAQ  阅读(343)  评论(0编辑  收藏  举报