在分布式系统中,我们一般会根据业务对服务进行划分,这就会存在一些服务间的调用关系,所以普通的本地事务是满足不了我们的要求了,需要引入分布式事务来实现我们的一致性的要求。
这里对事务进行一个简单的介绍:
同学A给同学B转250块钱,系统首先从同学A的银行卡扣除250块钱,如果上述这个步骤成功了,但是系统往同学B的银行卡上转250块钱的时候失败了,那么就会造成数据对不上的情况了。在这种情况下我们就需要引入事务,保证转钱这两步操作要么同时成功要么同时失败,成功的情况就是同学B银行卡也收到了钱,失败的情况是回滚把钱退回给A。
我们先从强一致性的场景说起,我们先了解一下 ACID 理论:
- Atomicity:原子性(要么全部执行,要么全部都不执行)
- Consistency:一致性(数据库只有一个状态,不存在未确定状态)
- Isolation:隔离性(事务之间互不干扰)
- Durability: 永久性(事务一旦提交,数据库记录永久不变)
分布式事务实现方案也比较多(比如两阶段提交、三阶段提交、TCC等),下面我们对它们进行一些简单的介绍
2PC:两阶段提交
从名字我们可以理解到,2PC就是有两个阶段,一个是准备阶段,一个是提交阶段
Prepare阶段:协调者发起提议,问大家是否接受,这个阶段做了除提交事务外的所有事情。