聊聊ACID | 青训营笔记

179 阅读2分钟

这是我参与 第五届青训营 伴学笔记创作活动的第16天。

重点内容

本节课老师从抖音红包雨案例开始讲起,介绍了关系型数据库的一些基本概念,然后围绕核心技术进行讲解,最后结合字节跳动企业内部实践讲解如何应对线上业务的一些挑战。

ACID

先来聊聊关系型数据库的事务,离不开ACID四个特性——原子性、一致性、隔离性、持久性。

转账这个案例来认识事务再合适不过了。

比如抖音红包雨抢红包,小明中了一个亿,按照规则,抖音发钱账户扣除一个亿,而小明账户增加一个亿。

原子性

但是如果抖音账户刚扣除一个亿的瞬间,服务器挂了......

小明账户上没有增加一个亿,也就是说,抖音账户上的一个亿不翼而飞......

但是我们希望整个转账入账操作要么全部发生,要么全部不发生,以防一个亿不翼而飞。

这就是原子性。

一致性

活动期间,抖音账户的钱一批批发出去,到了要给小明转一个亿的时候了,但是此时抖音账户只有0.5亿。

So?

如果转账操作成功进行,抖音账户变成-0.5个亿......

而小明账户上多了1个亿。

这平白无故多出来的0.5个亿由银行承担,银行肯定不干,反手就是一个举报......

所以我们需要确保每个操作都是合法的,在这里就是不能存在余额为负值的不合法情况,也不能说抖音转账0.5亿,而小明入账1亿,必须转账和入账的金额保持一致,这就是一致性。

隔离性

小明比较喜欢网上冲浪,不但在抖音抢了1个亿,还在快手抢了一个亿,所以小明最后账户金额应该是2亿对不对,但假如这时候转账同时进行,而且都以为小明余额为0,要将余额增加为1个亿。

So?

image.png

小明赚了又没完全赚。

我们希望多个操作同时进行的时候,两者操作互不干扰最后的结果,这就是隔离性

持久性

转账操作进行完毕,小明账户如期增加了2个亿,但这时候数据还没写到磁盘上,服务器又挂了......

小明打开账户一看,金额果然没有增加。

小明哭晕到厕所......

我们希望操作进行完之后,数据能够持久保留下来,而不会因为服务器的突然宕机而丢失数据,这就是持久性