宅在家里写数据库中事务(ACID)

数据库中的事务(Transaction)的四大特征原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),这里以一个银行转账的经典例子进行讲解,假设A和B各有1000元钱,有一个事务是A像B转200元。

目录

原子性(Atomicity)

一致性(Consistency)

隔离性(Isolation)

脏读

不可重复读

幻读

持久性(Durability)


原子性(Atomicity)

原子性时指事务是一个不可分割的整体,要么都发生,要么都不发生

上图的转账事务分为两个过程

首先对A:1000 - 200 = 800

然后对B:1000 + 200 = 1200

对于事务的原子性而言,A不仅要减少200元,而且B也要增加200元,或者是都不变,不能只减少或只增加

一致性(Consistency)

一致性是指,事务的前后数据必须保持一致,也就是说,刚开始A和B共2000元,他俩不管怎么转,总和都是2000元

操作前A:1000元 B:1000元

操作后A:800元 B:1200元 

操作前后,A和B的总和都是2000,并没有因为转而改变总和,这就是一致性

隔离性(Isolation)

隔离性是指,当多个用户并发操作时,每个用户都是一个事务,多个事务之间互不影响,相互隔离

当发生并发操作时,我们需要考虑事务的隔离级别,分别是脏读、不可重复读和幻读,我们通过A向B赚200元同时C向B转100元来进行讲解

如果按正常的来讲结果应该是

对A:1000 - 200 = 800

对B:1000 + 200 = 1200

对C:1000 - 100 = 900

再对A:1200 + 100 = 1300

脏读

所谓脏读,是指一个事务读取了另一个事务未提交的数据,也就是

对A:1000 - 200 = 800 此时B还没有来得及更新为1200,C就读取了B为1000的值,进行了转钱操作

对B:1000 + 200 = 1200

对C:1000 - 100 = 900 在这里C已经读取了B的值,而且是1000

再对B:1000 + 100 = 1100 由于C在B更新之前读取了1000

这样一来,就把B的值给错赋值为1100,这就是脏读

不可重复读

所谓不可重复读,是指,在一个事务内,多次读取数据不一定相同

如果初始A、B和C的钱都是1000元,当我们第一次查询时,结果是

A:1000元 B:1000元 C:1000元

但是,当我们第二次读取的时候,来了个D,给B转了500元,所以我们查出来的结果是

A:1000元 B:1500元 C:1000元

导致了两次查询结果不同,这就是不可重复读

幻读

所谓幻读,就是一个事务内,读取了别的事务插入的数据,导致前后读取不一致

如果初始有A、B和C的钱都是1000元,当我们第一次查询时,结果是

A:1000元 B:1000元 C:1000元

但是,由于在数据库表中又加入了一个D其金额为500元,那么在次查询的时候,结果就是

A:1000元 B:1000元 C:1000元 D:500

持久性(Durability)

持久性是指一个事务一旦被提交,他对数据库中数据的改变是永久性的

如果在A向B转钱的时候,出现了断电等意外情况

对A:1000 - 200 = 800

对B:1000 + 200 = 1200

如果是事务还没有提交,出现了断电等意外情况,那么重启数据库后,数据库中A和B的值为

A:1000 B:1000

如果是事务已经提交了,出现了断电等意外情况,那么重启数据库后,数据库中A和B的值为

A:800 B:1200 

发布了387 篇原创文章 · 获赞 255 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/HeZhiYing_/article/details/104127237
今日推荐