事务的ACID

事务具有4个特征,分别是原子性、一致性、隔离性和持久性,简称事务的ACID特性;

一、原子性(atomicity)

一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作,这就是事务的原子性

二、一致性(consistency)

事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。

如果数据库系统在运行过程中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所作的修改有一部分已写入物理数据库,这是数据库就处于一种不正确的状态,也就是不一致的状态

三、隔离性(isolation)

事务的隔离性是指在并发环境中,并发的事务时相互隔离的,一个事务的执行不能不被其他事务干扰。不同的事务并发操作相同的数据时,每个事务都有各自完成的数据空间,即一个事务内部的操作及使用的数据对其他并发事务时隔离的,并发执行的各个事务之间不能相互干扰。

在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同,分别是:未授权读取,授权读取,可重复读取和串行化

1、读未提交(Read Uncommited),该隔离级别允许脏读取,其隔离级别最低;比如事务A和事务B同时进行,事务A在整个执行阶段,会将某数据的值从1开始一直加到10,然后进行事务提交,此时,事务B能够看到这个数据项在事务A操作过程中的所有中间值(如1变成2,2变成3等),而对这一系列的中间值的读取就是未授权读取

2、授权读取也称为已提交读(Read Commited),授权读取只允许获取已经提交的数据。比如事务A和事务B同时进行,事务A进行+1操作,此时,事务B无法看到这个数据项在事务A操作过程中的所有中间值,只能看到最终的10。另外,如果说有一个事务C,和事务A进行非常类似的操作,只是事务C是将数据项从10加到20,此时事务B也同样可以读取到20,即授权读取允许不可重复读取。

3、可重复读(Repeatable Read)

就是保证在事务处理过程中,多次读取同一个数据时,其值都和事务开始时刻是一致的,因此该事务级别禁止不可重复读取和脏读取,但是有可能出现幻影数据。所谓幻影数据,就是指同样的事务操作,在前后两个时间段内执行对同一个数据项的读取,可能出现不一致的结果。在上面的例子中,可重复读取隔离级别能够保证事务B在第一次事务操作过程中,始终对数据项读取到1,但是在下一次事务操作中,即使事务B(注意,事务名字虽然相同,但是指的是另一个事务操作)采用同样的查询方式,就可能读取到10或20;

4、串行化

是最严格的事务隔离级别,它要求所有事务被串行执行,即事务只能一个接一个的进行处理,不能并发执行。

四、持久性(durability)

一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。--即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束的状态



作者:老城底
链接:https://www.jianshu.com/p/fc8a654f2205
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

<think>嗯,用户想了解数据库事务ACID特性,我需要详细解释每个特性。首先,ACID是原子性、一致性、隔离性和持久性的缩写,对吧?那我得一个一个来。 原子性,用户可能知道原子操作不可分割,但具体到数据库事务,应该是指事务中的操作要么全部成功,要么全部失败回滚。比如转账的例子,扣钱和加钱必须都成功,否则回滚。这时候需要引用原子性的部分,记得用引用[1]和引用[2],因为它们提到了原子性。 接下来是一致性,这个可能有点抽象。事务执行前后数据库必须保持一致性状态,比如转账前后总金额不变。这需要应用层的逻辑和数据库约束共同保证。引用中好像没有直接提到一致性,不过引用[1]和[2]可能涉及,不过可能用户提供的引用里没有详细说明,需要结合自己的知识解释清楚。 然后是隔离性,多个并发事务之间互不干扰。比如两个事务同时操作同一数据,可能出现脏读、不可重复读等问题。数据库通过隔离级别来控制,比如读未提交、读已提交等。引用[3]详细讲了隔离性,提到了并发控制和隔离级别,所以这里需要重点引用[3]。 最后是持久性,事务提交后对数据的修改是永久性的,即使系统故障也不会丢失。通常通过日志和备份实现。引用[3]最后提到了持久性,可以引用这里。 用户可能还关心这些特性如何实现的,比如原子性通过undo log,持久性通过redo log。需要简单说明实现机制,但用户提供的引用里可能没有,所以根据常识补充。 另外,用户提供的引用中提到了隔离级别和并发控制,所以在隔离性部分要展开讨论不同的隔离级别及其影响。比如读未提交可能导致脏读,而可串行化隔离级别最高但性能差。 要确保回答结构清晰,每个特性单独成段,用例子帮助理解。最后生成相关问题,比如ACID的实现原理,隔离级别的区别,事务管理的方法等。检查是否所有引用都正确标注,比如引用[1]提到原子性,引用[3]讨论隔离性和持久性。 可能还需要注意用户提到的“系统级指令”,比如数学公式要用$...$,但这里主要涉及概念,可能用不上数学表达式。不过如果有涉及公式的地方,比如一致性中的约束方程,可能需要用LaTeX,但用户的问题可能不涉及,所以可能不需要。 最后确保回答用中文,引用标识自然添加在相关句子的末尾。检查是否有遗漏的特性或错误解释,确保每个特性解释准确,并引用正确的来源。</think>### 数据库事务ACID 特性 数据库事务的 **ACID** 特性是保证数据操作可靠性和一致性的核心原则,包含以下四个特性: #### 1. 原子性(Atomicity) 事务中的所有操作要么全部成功执行,要么全部失败回滚,不允许部分完成。例如,转账操作中“扣减A账户余额”和“增加B账户余额”必须同时成功或同时撤销。 **实现机制**:通过日志(如 `undo log`)记录事务操作,失败时反向执行日志恢复数据[^1][^2]。 #### 2. 一致性(Consistency) 事务执行前后,数据库必须从一种一致状态转换到另一种一致状态。例如,转账前后两个账户的总金额应保持不变。 **实现依赖**:需要应用层逻辑(如业务规则)和数据库约束(如唯一索引、外键)共同保障。 #### 3. 隔离性(Isolation) 多个并发事务的执行互不干扰,每个事务感知到的数据状态独立于其他事务。例如,事务A未提交时,事务B无法读取其修改的数据。 **实现方式**:通过 **并发控制技术**(如读写锁、多版本控制)和 **隔离级别**(如读未提交、可重复读)来平衡隔离性与性能[^3]。 **常见问题**: - 脏读(读取未提交的数据) - 不可重复读(同一事务内多次读取结果不同) - 幻读(新增或删除的数据影响查询结果) #### 4. 持久性(Durability) 事务提交后,对数据的修改是永久性的,即使系统故障也不会丢失。例如,转账成功后,数据即使遭遇宕机仍能恢复。 **实现机制**:通过日志(如 `redo log`)和持久化存储(如磁盘备份)保障。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值