数据库事务的四大特性详解(ACID)

数据库事务的四大特性详解(ACID)-mikechen

数据库事务具有四大特性:原子性、一致性、隔离性、持久性,简称4大ACID特性,下面一一详解@mikechen

原子性(Atomicity)

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,原子性仅仅意味着它不能被分解,因此事务就是一个最小的执行单元。

假如A转500块钱给B,原子性保证了A的余额将被扣除500,B的余额将增加500。

整个过程要么全部成功,要么全部失败,不能出现A的余额扣除成功,B的余额增加失败的情况。

这就是原子性,事务中包含的各操作要么都做,要么都不做。

一致性(Consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,事务开始之前和事务结束以后,数据不会被破坏。

比如:A转500块钱给B,不管成功与否,转入前和转入后两个人的余额和是一致的。

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态,这就是数据库事务的一致性。

隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如操作同一张表时数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

如果事务之间不是隔离的,可能会出现以下问题:

(1) 脏读(dirty read):一个事务在处理过程中读取了另外一个事务未提交的数据。例如事务A中a给b转100块钱,在该事务中首先a的账户减100块,而在此时事务B中查询a的账户发现a少了100块,然后事务A中b账户加钱时发生了意外导致事务A回滚。这个时候事务B拿到的a账户就是脏数据了。

(2) 不可重复读(none-repeatable read):在一个事务范围内多次查询某个数据却得到不同的结果。例如事务C中b要提现100块,首先查询b账户余额发现有100块满足提现要求,此时事务D中b转账100给a并且提交事务成功,在事务C中再次查询b的账户余额发现已经没有钱了。

脏读和不可重复读的区别在于脏读是读取到了另一个事务未提交的数据,不可重复读是读取到了其他事务提交的数据。

(3) 幻读(phantom read):事务E中对一个表中所有数据做了从0修改为1的操作,这时事务F又向这个表插入了一行数据,而这个数据项中值为0并提交事务。此时事务E查询会发现还有一行数据没有修改,这就是幻读。

不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

持久性(Durability)

持久性也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

比如:A有1000元,它把500转给了B,每次我们查询A的余额时,我们应该得到最新的值,不能丢失这些细节。

作者简介

陈睿|mikechen,10年+大厂架构经验,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法