03|强一致性:别再用BASE做借口,来看看什么是真正的事务一致性
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了分布式数据库中的事务一致性问题,从强一致性的角度出发,探讨了事务一致性的重要性以及与ACID和BASE的关系。作者首先介绍了BASE理论的基本概念,指出其放弃了ACID的一些特性,追求高性能和可用性的平衡。随着技术的发展,原本的平衡点也在不断变化,甚至一些NoSQL数据库也开始增加对事务的支持。文章详细解释了事务的ACID特性,包括原子性、一致性、隔离性和持久性,并强调了它们在数据库中的重要性和实现机制上的复杂性。对隔离级别的定义进行了介绍,包括ANSI SQL-92对隔离级别的定义以及1995年Jim Gray等人发表的论文“Critique”对事务隔禅性进行更加深入的分析。文章还讨论了快照隔离和写倾斜等异常现象,以及MVCC技术在快照隔离中的重要性。此外,还介绍了分布式数据库中强一致性的概念,以及一些产品实现上的挑战和尝试。整体来说,本文通过对BASE理论、ACID特性和隔离级别的介绍,深入探讨了事务一致性在分布式数据库中的重要性和复杂性,为读者提供了全面的技术视角和理论基础。
《分布式数据库 30 讲》,新⼈⾸单¥59
全部留言(29)
- 最新
- 精选
- 鱼置顶这篇文档是我见到少有提到写倾斜关于隔离的文档了,(实际上大部分人对事物的了解都是面试前背一背4中隔离级别)。喜欢这篇文档的同学强烈建议看一看《数据密集型系统设计》这本书,它虽然没直接提到Critique的六种隔离级别,但是详细介绍了快照级别的隔离和写倾斜的例子。看评论,很多同学对写倾斜不太明白,我解释一下:写倾斜其实更像是业务应该考虑的事情,就是你要做一件事(修改数据A),依赖于目前已经存在其他数据B。但是你修改数据A的时候是不锁定数据B的,你修改的过程中,A被另外一个用户修改了,造成你最终目的的没达到(一致性)。常见的场景,如用户余额减扣,排班等等。 要规避写倾斜的措施有多种,我列举一下,其中前两种是老师提到的: 1.实际串行执行(典型的就是redis) 2.SSI(实际上是一个学生的论文得到的),就是乐观锁的原理 3.基于两阶段加锁锁定读数据(简言之就是对读到的不需要修改的数据也加锁 for update) 4.实体化冲突(这个参考mysql45讲,林老师的方案) 5.业务上控制(我觉得工作中用的比较多,比如电商的余额锁定和优惠券锁定类似于TCC吧)2021-01-27839
- 赵见跃写的太好了!!! 当初就是学习了林晓斌老师《MySQL 实战 45 讲》,使我认识了极客时间,课程非常好! 随后又买了几个课程,可惜都没有达到林晓斌老师的高度,曾经一度对极客时间产生了怀疑, 还好,幸运的是今天看到了王磊的课程,感觉又有希望了。王老师的课程客观理性、深入浅出! 收获满满,谢谢老师。
作者回复: 谢谢,这个评价好高呀,写起来更有动力了,哈哈。
2020-08-141328 - 过老师,我的观察点和大家不太一样,我想请问 比如"A Critique of ANSI SQL Isolation Levels“这样的论文,在国外是发布在哪里的,以及 数据库方面相关的论文或一手资源 有哪些值得关注的信息源。(说白点就是,在信息渠道获取方面,我应该怎么让自己混得6一点)
作者回复: 这问题的角度很好,我很愿意回答。个人体会,论文来源有三个。首先是顶会,就是数据库领域的三大顶会SIGMOD、VLDB、ICD;其次,优秀的论文会引用优秀的论文,所以参考文献千万不要放过;最后,就是关注工业界成果,很多领域是工业界开坑,学术界跟上,比如Google就做了很多开坑的工作,这些经典论文值得多读,而且工业界论文阅读难度也小些。
2021-08-2710 - 与路同飞老师每节课的思维导图很赞
作者回复: 希望能帮大家高效得学习课程的内容:)
2020-08-147 - 张永志有关MVCC我发表一下自己的认识: MySQL下 RR与RC隔离级别的操作都分当前读和快照读,当前读才会加锁,快照读都是不加锁的。RR 快照读是可以消除幻读的,因为这是事务开始时的快照一致性读,而RC是语句快照一致性读。 有关本课的问题: 数据块未能及时落盘,重新启动数据库会进行实例恢复,从最后的检查点开始将redo进行前写和回滚,这样就能保证数据块与redo一致了,实例恢复后,数据库就可以对外访问了。
作者回复: 说的很好,我再补充一下,在正常写入过程中WAL和内存中的数据也要保证一致,因为第一时间数据库通常是不会将数据表落盘的,内存中有数据即可对外服务。
2020-08-1884 - 南国首先回答问题,其实对此方面了解不多,强答一下:其实预写日志在我看来就是redo日志,如果redo日志已经成功证明已经落盘,此时数据可以根据redo日志异步的刷回磁盘,写数据表失败应该就是后面异步写回出现问题,我们只需要重演redo日志就可以了。当然这只是最简单的过程,细节还是看其他留言和老师的解答啦 其实我感觉这一章中既然是说分布式数据库的事务,我觉得也应该说说分布式事务,毕竟我们定义了数据库是分片的,如果事务涉及到多个机器就得上分布式事务了呀。 还有确实很巧,以前我写过一篇关于事务的博客,里面有几个例子都非常直观,理解起几个文中的概念也更简单些:https://blog.csdn.net/weixin_43705457/article/details/105443927
作者回复: 你好,WAL的意义在于它的写入时机,一定是同步写入的,WAL如果不能写成功,SQL提交一定是失败的。同时,与WAL相关的,数据库也要处理内存中的数据与WAL协同的问题,因为多数的数据库都是第一时间写入内存结构的,而后再根据不同策略落盘。关于分布式事务的实现机制,后面还有好几讲,你也可以关注下。
2020-08-1463 - 佳佳的爸解决写倾斜主要就是加上写锁,但是这样会严重影响并发性能。
作者回复: 是的,传统方案是使用锁(S2PL)来解决,但性能较差。还有其他的悲观协议,比如串行化图检测(SGT),我在14讲会做介绍。
2020-08-212 - 姑射仙人" 数据一致性关注的是单对象、单操作在多副本上的一致性,事务一致性则是关注多对象、多操作在单副本上的一致性,分布式数据库的一致性是数据一致性与事务一致性的融合。" 老师,分布式数据肯定也要支持分布式事务,那分布式事务是多对象、多操作在多副本上的实现吗?有点混了。
作者回复: 是的,同时有数据一致性和事务一致性上的要求
2021-03-091 - 扩散性百万咸面包我之前的发言有些误解,我再阐述一下: SI隔离级别是MVCC,实际上RR也可以用MVCC,不过之前没有这种技术,都用的是2PL。SI主要通过Gap lock来解决RR的幻读?因为光一个MVCC是解决不了幻读的。
作者回复: 另一个问题中也讲了,MVCC是底层技术。Gap Lock只是MySQL的实现技术,也不是SI的唯一实现方式。
2020-08-151 - 扩散性百万咸面包有点问题: 快照隔离相当于是比可重复读解决了幻读的问题,文章中说是MVCC的功能特性,但是MVCC并不能解决幻读呀,真正解决幻读的是Gap Lock(Mysql)? 而且可重复读也可以使用MVCC来实现吧?
作者回复: 你好,不是说MVCC可以解决幻读。MVCC是的底层技术,在这个基础上更容易实现快照隔离,而快照隔离是要解决幻读现象的,否则就不是标准的快照隔离级别。
2020-08-1521