这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
今天学的是REDMS相关知识,而REDMS又叫关系型数据库,在关系型数据库有一个非常重要的特性,那就是事务,事务是由一组SQL语句组成的一个程序执行单元,它需要满足ACID特性。
什么是ACID?
A:原子性(Atomicity),事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。
C:一致性(Consistency),数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性
I:隔离性(Isolation),多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其他事务运行效果。
D:持久性(Durability),多个事务完成以后,该事务对数据库所作的更改边持久的保存在数据库中,并不会被回滚。
原子性分析与理解:
假设用户A账上余额300,用户B账上余额0,用户A想给用户B转账100块,转账过程中服务突然挂了,此时用户A扣款成功,钱还没到用户B账上,那么A人间蒸发100块血亏,B还是0。所以只有当用户A成功扣款,用户B成功到账,才是真正的成功,这就是事务的原子性,要么同时成功,要么同时失败。
一致性分析与理解:
假设用户A账上余额300,用户B账上余额0,用户A想给用户B转账500块,并且扣款成功了,用户A余额变成了-200,用户B到账500,很明显这是不对的,余额不能为负数,不然这多支出的钱由谁来出呢,银行还是用户?所以每个操作都必须是合法的,账户信息应该从一个有效状态变为另一个有效状态。
隔离性分析与理解:
假设用户A余额0,用户B给用户A转账100,用户C也给用户A转账100,两个操作同时进行,都是从0开始往上增加,最后的结果就是用户A余额只有100,用户B和用户C各自少了100,这就有问题,所以两个操作在对同一个账户并发进行操作时,应该是相互不影响的,表现得像是串行操作。
持久化分析与理解:
假设用户A账上余额300,用户B账上余额0,用户A想给用户B转账100块,服务已经收到,但是还没有写到磁盘上,这个时候服务突然挂了,所以这个时候,我们就应该保证操作更新之后,更新的结果应永久性的保存下来,不因宕机等问题而导致数据丢失。
老实说,在此之前,我对事务的理解一直停留在出错了可以回滚, 然后对于原子性,一致性,隔离性和持久化这些词汇感觉一直很是高大上,有点可望不可及的感觉,但学完后,虽然不说完全理解,但是对于这些知识已经有了足够的认知。