转载请附本文链接:https://blog.csdn.net/maxlovezyy/article/details/103745151
最近读了论文Spanner,发现其事务的实现还是蛮有意思的,设计上有一些不是很显而易见的地方,这里记录一下,希望能对更多的人有所帮助。下面先介绍一下其实现事务的基本依托和组件,之后再详细分析一下其事务的实现。
引子
目前数据库的数据模型基本上都是MVCC的模型,读不需要上锁,基于快照即可,写的话也不需要in-place地更改,对IO来讲也是很友好的,具有很好的性能。另一方面,对于数据库的串行化技术来讲,主要有两种手段,一个是锁,一个是基于时间戳排序,时间戳可以和MVCC很好地结合。
Spanner也采用了MVCC的数据模型,通过锁和时间戳排序结合的方式来保证事务的ACID特性。另外,Spanner是一个全球化的数据库,这意味着它的时间戳不能像Percolator中提到的一个集中的时钟服务来提供了,其用到的是下节中介绍的TrueTime,这是一个类似于NTP的一套时钟保证机制,可以认为是一个能提供误差有界的、精度很高的物理时间的时钟机制。
TrueTime
Spanner通过原子钟和GPS授时结合,提供了上下误差在2ms以内的物理时钟服务,其API如下:
| Method | Returns |
|---|---|
| TT.now() | TTinterval: [earliest, latest] |
| TT.after(t) | true if t has definitely passed |

本文深入探讨了Google Spanner数据库的事务实现机制,包括其基于MVCC的数据模型、TrueTime时钟服务、软件架构及事务类型。分析了读写、只读及快照读事务的处理流程,以及为确保线性一致性和串行化隔离级别所采用的悲观锁和乐观锁结合策略。

412

被折叠的 条评论
为什么被折叠?



