在应用程序中,往往一个业务的完成,需要执行多次操作,我们希望这些操作是可以全部成功,或者全部失败,而不是停止在一半,这就涉及到事务的概念。

事务和ACID

事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。事务应该具有 4 个属性:

原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。

这四个属性通常称为 ACID 特性。

在单体应用程序中,可以依赖外部数据库的事务特性来实现。但是分布式系统中,调用远程服务,就无法依赖外部的事务。

<aside> ❓ 🤔数据库是如何实现事务的呢?

</aside>

不同数据库对事务的实现方式不同,但是大多会使用MVCC机制 事务之「 MVCC」 。具体可以看 PostgreSQL 事务原理:ACID 实现 和 MVCC 多版本并发控制 图文并茂讲解 Mysql 事务实现原理

分布式事务

分布式系统最大的特点是:一个业务流程需要组合一组服务实现。

带来的一个明显的问题就是,需要业务上保证一致性。如果⼀个步骤失败了,那么要么回滚到以前的服务调⽤,要么不断重试保证所有的步骤都成功,即保证事务。由于业务操作分布在不同的节点上,所以称作分布式事务。

例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。

分布式锁和分布式事务区别: