MarsTalk | 如何给老婆讲懂两阶段提交

2022-08-11 14:30:54 浏览数 (1)

导言:

不造有没有朋友发现,我的公众号改名儿了!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)

周中愉快!

0 人点赞