Skip to content

什么是事务,事务有哪几种特性

1. 什么是事务(Transaction)

事务是一组要么全部成功、要么全部失败回滚的数据库操作序列,它的核心价值是:在并发与故障存在的现实环境下,仍能把业务操作当成一个“可靠的原子单元”来完成。

从使用方式上看,事务需要明确“边界”:

  • 自动提交(autocommit):每条 SQL 语句默认就是一个事务。
  • 显式事务:由业务显式开启/提交/回滚,覆盖多条 SQL。
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
COMMIT;

2. ACID:四个字母分别解决什么问题

ACID 不是口号,最好能说清楚每个字母的“工程含义”。

2.1 原子性(Atomicity)

原子性保证:事务中的操作要么全部提交生效,要么全部回滚,不会出现“扣款成功但加款失败”的中间态。

以 InnoDB 为例,原子性通常依赖:

  • Undo Log(回滚日志):记录修改前的版本,用于回滚与 MVCC。

2.2 一致性(Consistency)

一致性强调:事务执行前后,数据库必须从一个满足约束的状态转移到另一个满足约束的状态。

这里的一致性包含两层:

  • 数据库层:主键/唯一/外键、NOT NULL、CHECK(不同数据库支持程度不同)等约束。
  • 业务层:例如“余额不能为负”“库存不能小于 0”,常由业务代码 + 事务共同保证。

2.3 隔离性(Isolation)

隔离性保证:多个事务并发执行时,彼此的中间过程互不干扰,避免读取到不一致的中间态。

常见并发现象:

  • 脏读(Dirty Read)
  • 不可重复读(Non-repeatable Read)
  • 幻读(Phantom Read)

隔离性的实现手段通常是:

  • 锁(Lock):行锁、间隙锁等,限制并发写/读写。
  • MVCC(多版本并发控制):读读不加锁,通过版本链与快照读提升并发。

2.4 持久性(Durability)

持久性保证:事务一旦提交,结果在系统崩溃后也不会丢失。

以 InnoDB 为例,持久性通常依赖:

  • Redo Log(重做日志):记录“做了什么修改”,用于崩溃恢复重放。
  • 刷盘策略(例如何时 fsync)与组提交(Group Commit)会影响性能与持久性强度。

3. InnoDB 视角:ACID 与组件的对应关系

ACID 典型实现要素(以 InnoDB 为例)
A 原子性 Undo Log + 回滚机制
C 一致性 约束 + 事务语义 + 业务逻辑
I 隔离性 锁 + MVCC + 隔离级别
D 持久性 Redo Log + 刷盘策略 + 崩溃恢复