导言:
不造有没有朋友发现,我的公众号改名儿了!Pair Programming,也就是:结对编程~
是的,在我的盛情邀请下,Mars(就是前文的小量子,别问我为什么改回去Mars,我再也不会帮他改名字了)也要参与写文了,这将是一个有两位作者的公众号了~之后每周三,Mars都会给大家带来一篇技术文章,每周六,还是我来唠唠叨叨~
欢迎大家欣赏Mars的第一篇文章,讲讲数据库里面的一个概念:两阶段提交。
周末天气很好,我们打算去公园烧烤,需要提前购买:
1. 食物
2. 烧烤架
3. 煤炭
(Min:这就是直男的文章开头,单刀直入,没有任何起承转合...)
方案一
食物需要去超市购买,而且不能退货;
烧烤架需要去户外商品店购买,支持七天无理由退货;
煤炭需要去附件的小店购买,支持七天无理由退货。
食物、烧烤架、煤炭都有可能缺货,而我们需要全部买齐才能去公园烧烤,否则只能宅在家里。
(Min:你就不知道去别地儿吗!)
这是一个不需要使用两阶段提交的场景,一个正确的购买流程如下:
方案二
本来方案已经设计的挺好了,但是老婆突然说想吃烤秋刀鱼,而秋刀鱼只能去海鲜市场购买,而不支持退货。原先的方案就行不通了,因为不管先去超市买食物还是先去海鲜市场买秋刀鱼,买了其中一个万一另外一个没有了,就没办法退货了。
(Min: 此处为什么黑老婆,老婆就有这么麻烦吗,老婆不服。)
没关系我们还有两阶段提交算法,流程如下:
在购买食物和秋刀鱼之前,需要两个人同时去超市和海鲜市场确认有没有(prepare阶段)。如果其中一个没有或者两个都没有,就放弃购买;只有在两边同时有的情况下,才一起购买(commit阶段)。这样才能保证要么都不买,要么都购买。
方案三
由于本人比较懒,不想跑这么多地方,而且万一去超时购买食物失败,还需要再回去退煤炭和退烧烤架,有没有一种办法能一下子买齐(或者如果其中一个缺货,直接告诉我凑不齐)?
答案显而易见就是淘宝,流程如下:
根本的原因是淘宝的确认购买操作具有原子性:
- 如果购物车里面某个商品缺货,会导致确认购买失败
- 只有当购物车里面的商品都有货的时候,才会确认购买成功
- 一旦确认购买成功,你肯定能买到所有购物车里面的商品
下面的可以不看
对应到技术领域,
- 方案一:业务逻辑自己实现原子性,一旦某个操作失败,需要写代码回滚之前成功的操作
- 方案二:业务逻辑使用两阶段提交算法保证原子性
- 方案三:使用支持事务的数据库
有人看懂了吗!
数据库作为一个已经存在了hin久hin久的数据保存方式,已经积累了许许多多的智慧在里面,有很多巧妙优雅的问题解决方式,其实很值得借鉴到生活中哦~
期待Mars带我们领略更多数据库有趣,精妙的一面~
顺便硬广一下Mars所在公司的数据库产品(他说不帮他发广告就不给我供稿了):
TiDB 是 PingCAP 公司设计的开源分布式 HTAP数据库,结合了传统的 RDBMS 和 NoSQL 的最佳特性。TiDB 兼容 MySQL,支持无限的水平扩展,具备强一致性和高可用性。TiDB 的目标是为 OLTP和 OLAP场景提供一站式的解决方案。 HTAP (Hybrid Transactional and Analytical Processing) OLTP (Online Transactional Processing) OLAP (Online Analytical Processing)
周中愉快!