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