ACID——数据库事务正确执行的四个基本要素

本文详细介绍了数据库事务正确执行的四大核心要素:原子性、一致性、隔离性和持久性(ACID)。探讨了这两种特性的实现机制——预写日志(Writeahead logging)与影子分页(Shadow paging),并解释了它们如何确保数据的完整性和一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的默认规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
  • 隔离性:当两个或者多个事务并发访问(此处访问指查询和修改的操作)数据库的同一数据时所表现出的相互关系。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • 持久性:在事务完成以后,该事务对数据库所作的更改便持久地保存在数据库之中,并且是完全的。

由于一项操作通常会包含许多子操作,而这些子操作可能会因为硬件的损坏或其他因素产生问题,要正确实现ACID并不容易。ACID建议数据库将所有需要更新以及修改的资料一次操作完毕,但实际上并不可行。

目前主要有两种方式实现ACID:第一种是Write ahead logging,也就是日志式的方式。第二种是Shadow paging。


Write ahead logging(预写日志):
  1、事务所引起的所有改动都要记录在日志中,在事务提交完成之前,所有的这些记录必须被写入硬盘;
  2、一个 数据库 的缓冲页直到被记入日志后才能发生修改。直到缓冲页对应的日志被写入磁盘之后,该缓冲页才会存入磁盘;
  3、当缓冲页被修改和日志被更新的时候,在也上必须加上互斥锁,以保证改动被记录到日志中的顺序与它发生的顺序是一致的。

  以上规则的结果:

  1、如果一条日志记录未被存入硬盘,则它可以被忽略,因为该日志中包含的改动一定属于未提交的事务。此外,这样的日志不能反映已持久化在数据库中的改动;

  2、日志记录按顺序记录系统的改动。加锁协议(latch protocol)保证如果有对于同一页改动的两条日志记录,则两条记录的顺序反映对页发生改变的顺序。


Shadow paging(影子分页):

http://www.oocities.org/swarooppavi/ShadowPag.pdf


注:SQLite 默认采用影子分页技术,但最新的版本中也提供预写日志技术。
### 数据库事务的概念 数据库事务一组逻辑操作单元,这些操作要么完全执行成功,要么完全不执行。它是一个不可分割的工作单位,用于维护数据库的一致性和完整性[^1]。 在数据库管理系统的上下文中,事务通常由一系列SQL语句组成,它们共同完成一项业务功能。例如,在银行转账场景中,扣款和存款两个操作必须作为一个整体来处理——如果其中一个失败,则整个过程应被撤销以保持数据一致性。 --- ### ACID特性的详细解释 #### 1. **原子性 (Atomicity)** 原子性表示事务内的所有操作都是一个不可再分的整体工作单位。这意味着在一个事务中的所有变更只有在该事务成功完成后才会生效;如果有任何一个部分失败,则整个事务会被撤消(Rollback),恢复到初始状态。这种特性可以防止因程序错误或其他异常情况而导致的数据不一致问题[^3]。 ```sql START TRANSACTION; UPDATE accounts SET balance = balance - 100 WHERE account_id = 1; -- 扣款 UPDATE accounts SET balance = balance + 100 WHERE account_id = 2; -- 存款 COMMIT; ``` 在此例子中,如果第一条`UPDATE`语句执行成功而第二条失败,则会触发回滚机制,使两条更新均未发生。 --- #### 2. **一致性 (Consistency)** 一致性确保了任何给定时间点上的数据库都处于有效状态,并满足所有的预定义约束条件、索引规则以及其他属性设置的要求。换句话说就是说每次成功的交易都会把系统带入一个新的合法的状态之中。 这不仅涉及单个交易内部的变化是否符合预期目标,还包括跨多个表之间关系维持正确无误等方面的内容。比如上面提到过的账户余额转移过程中就需要保证总金额不变这一原则得到遵循。 --- #### 3. **隔离性 (Isolation)** 隔离性意味着即使存在并发访问的情况下,不同用户的活动也不会相互干扰。具体来说就是在同一时刻只有一个用户能够看到并修改特定资源实例直到另一个请求结束为止[^2]。 实现良好的隔离度可以通过多种方式达成,其中包括但不限于加锁策略或者MVCC(多版本并发控制)技术等等方法论的应用实践当中去寻找解决方案吧! 以下是几种常见的隔离级别: | 隔离级别 | 描述 | |------------------|----------------------------------------------------------------------| | READ UNCOMMITTED | 可能会出现幻读、不可重复读以及脏读等问题 | | READ COMMITTED | 解决了脏读现象 | | REPEATABLE READ | 进一步解决了不可重复读 | | SERIALIZABLE | 提供最高级别的隔离程度 | 每种等级都有各自适用范围及优缺点权衡考量因素在里面哦~ --- #### 4. **持久性 (Durability)** 一旦某个事务完成了它的提交动作之后,那么即便此时发生了诸如断电之类的灾难事件也依然不会影响已经保存下来的结果记录的真实性可靠性方面表现良好才行呢😊所以这就要求我们的DBMS软件产品本身具备完善的日志记录功能以便于能够在必要时候重新构建丢失的信息内容出来呀~[^4] 简单来讲就是当客户端收到通知表明某项任务已完成之时起往后无论遇到什么突发状况都不会改变这个事实啦😎 --- ### 总结 综上所述我们可以看出ACID四要素对于保障现代信息系统正常运转起到了至关重要的作用💪通过合理配置参数选项还可以进一步优化性能标达到最佳效果哟🎉
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值