理解Google Spanner(3):分布式事务原理与实现

本篇涉及到分布式事务的原理与Spanner事务实现,需要大概理解单机数据库事务,如果还不理解,可以先看看之前的两篇:

为了让下面的阅读不那么枯燥,先抛出几个问题大家可以思考一下:

  1. 分布式事务相比单机事务,有何难点?如何解决?
  2. 为什么在同一个Spanner事务中,提交之前完全读不到自己的写入?
  3. 什么是外部一致性?
  4. Spanner事务有哪些类型?分别适用于什么场景?
  5. Spanner读取是加锁还是MVCC?
  6. Spanner每个Paxos Group的每秒事务吞吐量是否有限制?

从0到1理解数据库事务(下):隔离级别实现——MVCC与锁

这是数据库事务分享的第二篇,上一篇讲解数据库事务并发会产生的问题,这篇会详细讲数据库如何避免这些问题,也就是如何实现隔离,主要是讲两种主流技术方案——MVCC与锁,理解了MVCC与锁,就可以举一反三地看各种数据库并发控制方案,并理解每种实现能解决的问题以及需要开发者自己注意的并发问题,以更好支撑业务开发。

先回顾一下上一篇讨论过的,如果没有隔离或者隔离级别不足,会带来的问题:

  • 脏写(Dirty Write)
  • 脏读(Dirty Read)
  • 不可重复读(Unrepeatable Read)
  • 幻读(Phantom)
  • 读偏差(Read Skew)
  • 写偏差(Write Skew)
  • 丢失更新(Lost Updates)

从0到1理解数据库事务(上):并发问题与隔离级别

最近准备写一篇关于Spanner事务的分享,所以先分享一些基础知识,涉及ACID、隔离级别、MVCC、锁,由于太长,只好拆分成上下两篇:

  • 上:并发问题与隔离级别 主要讲事务所要解决的问题、思路,先理解为什么需要事务以及事务并发控制中面临的问题。

  • 下:隔离级别实现——MVCC与锁 隔离性是为了更好地做到并发控制,事务的并发表现会对业务有直接影响,所以这篇会详细讲如何实现隔离,主要是讲两种主流技术方案——MVCC与锁,理解了MVCC与锁,就可以举一反三地看各种数据库并发控制方案,并理解每种实现能解决的问题以及需要开发者自己注意的并发问题,以更好支撑业务开发。

理解Google Spanner(2):数据是如何存储的

阅读本文之前,最好已经阅读过Spanner官方文档。 本文适合以下两类人: A. 如果你读完官方文档完全没能举一反三,还是一头雾水,不知道使用Spanner的正确姿势是什么,以及为什么这些姿势比较正确。那你就可以读一下这篇文章,一定会对你有帮助。 B. 如果你对数据库原理及其实现有一定理解,你读完官方文档已经举一反三大概猜测到了它的实现原理,大神,还是请你读一下这篇文章,交流一下我们理解不一致的地方。

重要的话再说一遍:阅读本文之前,最好已经阅读过Spanner官方文档,带着问题来读这篇文章,收获会更多一些。

(如果你想对Spanner的基本架构有一个概览,可以读一读上一篇:理解Google Spanner(1):数据复制与分片

本文会讲什么

要理解Spanner中的数据是如何被存储、组织的,只有三个关键词:

  • Key-Value数据库
  • LSM-Tree
  • PAX 行列混存

理解Google Spanner(1):数据复制与分片

现在工作中有很多项目开始转到Google Spanner,虽然是很牛逼的分布式数据库,但由于太新了,并且是闭源的,网上几乎没有什么资料可查,为了更好地使用它,开始了Spanner漫长的学习之路,一个东西只有自己能教会别人,才代表自己真的会了,因此准备进行Google Spanner的一系列分享,这是第一篇,主要是讲Spanner的数据复制与分片,最后会提到实际应用中会遇到的热点问题以及解决方案。