levy5307 / blog

https://levy5307.github.io/blog/
MIT License
0 stars 0 forks source link

分布式事务 #37

Open levy5307 opened 3 years ago

levy5307 commented 3 years ago

https://levy5307.github.io/blog/distributed-transaction/

事务的属性

ACID,事务的4个属性,这个每个人都很熟悉。其中:

A代表原子性,即:事务中的操作要么全部正确执行,要么全部不执行。在分布式系统中,其主要有2pc协议来保证的(另外还有一个3pc协议,但是只停留在理论阶段,没有太多实践意义),后面我会专门写一篇文章来介绍2pc的原理以及各个产品的优化实践。

I代表隔离性,即:多个事务并发执行时,对每个事务来说,它并不会感知系统中有其他事务在同时执行。隔离性有很多个级别,针对不同的级别有多种不同的实现方法,如:MVCC、2PL等。

D代表持久性,即:一个事务在提交之后,该事务对数据库的改变是持久的。持久性主要通过redo log来保证的,即如果宕机导致内存中的数据丢失了,需要通过redo log回放来进行恢复。

最后一个是C,其代表一致性。其定义是比较模糊的:数据库必须保证事务的执行从一个一致性状态转移到另一个一致性状态。其主要是指保证事务操作后保持原有的数据的约束。比如转账事务完成后,转账的双方的总金额不能多页不能少。在ACID中,C是目的,AID是手段,为了达到C的目的而提供的手段。数据库必须实现了AID的这三个特性才有可能实现C。

另外说一句,对于一个涉及a、b节点的分布式事务,如果节点a提交了本地事务,而节点b还没来得及提交,从而其他事务看到了其中间状态,这个问题是由隔离性来解决的。很多人误以为是一致性,其实是不对的。另外这里的一致性和多副本的一致性也不是一个概念。多副本一致性是指:

查询和更新单个对象的操作按一定顺序执行

更新操作的效果必然反映在后续查询操作返回的结果中
Dephaye commented 3 years ago

阿里为什么称OceanBase是串行化的?

levy5307 commented 3 years ago

@Dephaye 阿里为什么称OceanBase是串行化的?

沿用了Oracle的称呼。其实根本原因还是隔离级别的定义问题,在RR这就很乱