一、本地事务
简单来说,一个单体应用中,一般只会涉及一台数据库服务器,而数据库服务器本身就具有事务特性,这种在一台数据库服务器上实现的事务叫本地事务。
二、分布式事务
同理,在分布式系统中,每个应用都拥有自己的数据库服务器,此时想要实现多台应用之间的数据一致性,显然靠本地事务是无法实现的,因此需要实现分布式事务,也就是保证多个系统的操作原子性,要么全部成功要么全部失败的方式叫分布式事务。例如:
1)跨数据源的分布式事务
2)跨服务的分布式事务
三、分布式解决方案
分布式需要解决的问题就是不同系统之间的数据一致性问题,所以需要各个子系统之间互相等待,同时提交,同时回滚,达成强一致性。但是事务在等待过程中处于弱可用状态。各个子系统之间互相通讯,协调事务状态,因此需要一个事务协调者:
四、事务模式
1.基于两段性提交的XA模式
XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准(协议),几乎所有主流的关系型数据库都对 XA 规范 提供了支持。
一阶段:事务协调者通知每个事务参与者执行事务,事务参与者反馈执行结果,不提交事务
二阶段:如果收到事务均执行完成,则通知每个事务参与者提交事务
基于这个思想,2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案Seata。
XA模式优势:1)事务的强一致性,满足ACID原则 2)常用数据库都支持,实现相对简单,没有代码侵入。
XA模式劣势:1)一阶段需要锁定数据库资源,等待二阶段才能释放,性能较差 2)依赖关系型数据库。
2.TCC模式
通过人工编码实现诗句恢复,需要实现三个接口
1)Try:资源的检测和预留
2)Confirm:完成资源操作业务;要求 Try 成功 Confirm 一定要能成功
3)Cancel:预留资源释放,可以理解为try的反向操作
优势:数据一致性较好,灵活性较好,
劣势:开发成本高,有代码侵入,每个事务操作每个参与者都需要实现try/confirm/cancel三个接口。
3.基于消息队列的分布式事务
订单系统完成订单入库后,通知MQ向库存系统发送可减少库存消息,库存系统收到消息后减少库存执行本地事务,假如订单系统失败,不会触发消息发送,库存系统状态不变。
消息队列模式优势:由MQ协调完成,性能高,开发成本低
消息队列模式劣势:依赖数据库本地事务实现,MQ会出现频繁读取数据库记录,占用数据库资源。