# SAGA（A）

![left](./student-guide/diagram/10-SAGA-01-01.png)



-------------------------------------------------------------
Saga

1987年普林斯顿大学的Hector Garcia-Molina和Kenneth Salem发表了一篇Paper Sagas，讲述的是如何处理long lived transaction（长活事务）。Saga是一个长活事务可被分解成可以交错运行的子事务集合。其中每个子事务都是一个保持数据库一致性的真实事务。

Saga看起来很有希望满足我们的需求。所有长活事务都可以这样做吗？这里有一些限制：
- Saga只允许两个层次的嵌套，顶级的Saga和简单子事务
- 在外层，全原子性不能得到满足。也就是说，sagas可能会看到其他sagas的部分结果
- 每个子事务应该是独立的原子行为
- 在我们的业务场景下，各个业务环境（如：航班预订、租车、酒店预订和付款）是自然独立的行为，而且每个事务都可以用对应服务的数据库保证原子操作。

Saga对于ACID的保证和TCC一样：
- 原子性（Atomicity）：正常情况下保证。
- 一致性（Consistency），在某个时间点，会出现A库和B库的数据违反一致性要求的情况，但是最终是一致的。
- 隔离性（Isolation），在某个时间点，A事务能够读到B事务部分提交的结果。
- 持久性（Durability），和本地事务一样，只要commit则数据被持久。

时至今日，许多分布式事务方案和思路，中间件产品都有这个方法的影子。
