暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

ACID详解

原创 wzf0072 2023-10-05
352

ACID详解

ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

2.1 原子性(Atomicity)

一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作。实现事务的原子性,数据库要支持回滚操作,在事务中某个操作失败后,回滚到事务之前的状态。大多数数据库实现事务时,事务操作的数据是在事务相关的数据快照上,并不是真正修改实际的数据,如果有错不提交即可。而其他一些只支持简单事务的数据库系统中,事务更新数据不在快照上,而是直接操作实际数据,则系统需要先预演一遍所有要执行的操作,如果失败,事务相关的所有操作都不会被执行。

2.2 一致性(consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

如转账的栗子: 假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

事务的一致性决定了一个系统设计和实现的复杂度,因为事务可以有不同程度的一致性:

  • 强一致性: 无论更新操作实在哪一个数据副本执行,之后所有的读操作都能获得最新的数据。
  • 弱一致性: 提交的更新操作,不一定立即会被读操作读到,需要一段时间,此种情况会存在一个不一致窗口。
  • 最终一致性: 是弱一致性的特例。事务更新一份数据,最终一致性保证在没有其他事务更新同样的值的话,最终所有的事务都会读到之前事务更新的最新值。如果没有错误发生,不一致窗口的大小依赖于:通信延迟,系统负载等。

2.3 隔离性(Isolation)

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

当前大多数数据库都提供了不同级别的事务隔离,之后便会产生不同的问题,一般会出现的问题主要有:

  • 脏读

脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。当一个事务A正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时另外一个并发的事务B来访问该数据,将会获取到事务A中没有提交的数据, 从而最终造成两个事务得到的数据不一致。

如: 张三有500块钱,现在给李四转100块钱,这个事务中的SQL涉及到两个操作:1、 A账户减100块钱

update account set money=money - 100 where name=’张三’;

2、 B账户加100块钱

update account set money=money+100 where name=’李四’;

我们假设事务A执行转账,刚执行完第一条SQL语句,此时,另外一个事务B来查询张三账户的钱,那么获取到的是400块钱。但是事务A执行第二条语句的时候出现了问题,事务A进行了回滚,那么事实上张三账户的钱应该是500块钱,而不是400块钱,从而出现了脏读。

  • 不可重复读

不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。

不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

  • 幻读

幻读,是指当事务不是独立执行时发生的一种现象。

例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

  • 丢失更新

两个事务同时读取同一条记录,A先修改记录,B也修改记录(B是不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。

2.4 持久性(Durability)

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论