理解Google Spanner(3):分布式事务原理与实现
本篇涉及到分布式事务的原理与Spanner事务实现,需要大概理解单机数据库事务,如果还不理解,可以先看看之前的两篇:
为了让下面的阅读不那么枯燥,先抛出几个问题大家可以思考一下:
- 分布式事务相比单机事务,有何难点?如何解决?
- 为什么在同一个Spanner事务中,提交之前完全读不到自己的写入?
- 什么是外部一致性?
- Spanner事务有哪些类型?分别适用于什么场景?
- Spanner读取是加锁还是MVCC?
- 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的数据复制与分片,最后会提到实际应用中会遇到的热点问题以及解决方案。