欢迎光临
我们一直在努力

数据库事务ACID属性与并发隔离机制详解

文章目录

  • 前言
  • 一、ACID 属性逐字拆解
  • 二、深度剖析与经典示例
    • 2. 1 Atomicity(原子性)
    • 2.2 Consistency(一致性)
    • 2.3 Isolation(隔离性)
    • 2.4 Durability(持久性)
  • 结语

前言

在数据库管理系统(DBMS)中,事务(Transaction) 是指作为单个逻辑工作单元执行的一系列操作。而 ACID 是保障事务正确可靠执行的四大核心要素。

无论数据库在运行过程中遇到程序崩溃、断电还是并发冲突,ACID 特性都能确保数据的完整性和一致性。

一、ACID 属性逐字拆解

属性核心含义一句话大白话
A – Atomicity(原子性) 事务中的所有操作,要么全部成功,要么全部失败。 “要么全有,要么全无”
C – Consistency(一致性) 事务执行前后,数据库必须从一个合法状态转移到另一个合法状态。 “规则不能被破坏”
I – Isolation(隔离性) 多个并发事务同时操作时,它们之间不能互相干扰。 “各忙各的,互不影响”
D – Durability(持久性) 事务一旦提交,它对数据的修改就是永久性的,即使系统崩溃也不会丢失。 “落盘为安”

二、深度剖析与经典示例

为了让你彻底理解,我们引入一个最经典的场景:银行转账。

假设账户 A 准备向账户 B 转账 100 元。这个事务包含两个核心操作:

  • 账户 A 的余额减少 100 元。
  • 账户 B 的余额增加 100 元。
  • 2. 1 Atomicity(原子性)

    原子在化学中曾被认为是不可分割的最小颗粒,这里的原子性也是这个意思。

    • 为什么重要:如果步骤 1 成功了(A 扣了 100),但由于网络中断或断电,步骤 2 失败了(B 没收到),那这 100 元就凭空消失了。
    • 数据库如何保证:如果中途发生任何错误,数据库会执行 回滚(Rollback) 操作,把整个事务中已经执行的操作全部撤销,让数据回到事务开始前的状态。

    2.2 Consistency(一致性)

    一致性关注的是数据的业务规则和完整性约束。

    • 为什么重要:在转账前后,A 和 B 的余额总和必须是不变的(能量守恒);或者,账户余额不能为负数(如果银行有这个硬性约束)。
    • 理解误区:原子性和隔离性往往是实现一致性的手段,而一致性是目的。如果事务成功提交了,但数据库的合法性规则被破坏了(比如 A 扣了钱,B 没加钱,总额对不上了),那这就违背了一致性。

    2.3 Isolation(隔离性)

    当成百上千个用户同时在银行系统转账时,数据库必须保证这些并发操作不会把数据搞乱。

    • 为什么重要:如果隔离性不好,可能会产生各种并发问题,比如:
      • 脏读(Dirty Read):事务 B 读到了事务 A 还没提交的“临时修改”数据。如果 A 随后回滚了,B 读到的就是假数据。
      • 不可重复读(Non-repeatable Read):事务 A 在同一个事务内两次读取同一条数据,期间事务 B 修改了该数据并提交,导致 A 两次读到的结果不一样。
      • 幻读(Phantom Read):事务 A 按照某个条件读取了一批数据,期间事务 B 插入了符合该条件的新数据并提交,导致 A 再次读取时,发现凭空多出了几条记录。
    • 隔离级别:为了在“安全”和“性能”之间找平衡,SQL 标准定义了 4 个隔离级别(从低到高):
    • 读未提交(Read Uncommitted)
    • 读已提交(Read Committed)
    • 可重复读(Repeatable Read)
    • 串行化(Serializable)(最安全,但性能最差)

    2.4 Durability(持久性)

    一旦事务的提交(Commit)指令执行成功,数据库就会向用户返回“成功”信号。

    • 为什么重要:只要用户收到了成功提示,就算在下一微秒整个机房突然断电,当数据库重新启动后,A 扣掉的 100 元和 B 增加的 100 元也必须真真切切地存在于磁盘中。
    • 数据库如何保证:通常通过 预写日志(Write-Ahead Logging, WAL) 实现。在修改实际数据之前,先将修改行为记录到极其安全的顺序日志文件(如 MySQL 的 redo log)中。只要日志落盘了,即使数据还没来得及写入真正的表文件,系统重启时也能通过重放日志来恢复数据。

    技术底层延伸:MySQL 是怎么做到的? 以 MySQL 的 InnoDB 引擎为例,它内部有明确的分工来支撑 ACID:

    • A(原子性):依赖 undo log(回滚日志) 实现,它记录了数据的反向操作,失败时用来“撤销”。
    • I(隔离性):依赖 锁机制 和 MVCC(多版本并发控制) 实现。
    • D(持久性):依赖 redo log(重做日志) 和双写缓冲区实现。
    • C(一致性):由 A、I、D 共同保障,加上数据库自身的约束检查(如外键、唯一索引)。

    结语

    ACID是数据库事务可靠执行的基石。理解原子性、一致性、隔离性与持久性的内在关联,以及MySQL底层undo log与redo log的分工机制,是掌握高并发数据安全的关键。

    赞(0)
    未经允许不得转载:171主机测评 » 数据库事务ACID属性与并发隔离机制详解
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址