ACID 属性与异常
复习原子性、一致性、隔离性和持久性,以及四种经典异常:脏读、不可重复读、幻读和丢失更新
ACID 属性与异常 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
ACID
事务满足以下条件时才是可靠的:
- 原子性 — 要么全部完成,要么全部不完成
- 一致性 — 将数据库从一个有效状态转换为另一个有效状态
- 隔离性 — 并发事务不会互相干扰
- 持久性 — 一旦 COMMIT,数据即使发生崩溃也不会丢失
SQL 中的事务
使用 BEGIN ... COMMIT 包裹操作:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
-- If anything fails, ROLLBACK leaves both rows unchanged.原子性实践
如果第二个 UPDATE 失败,第一个 UPDATE 也会回滚——资金不会只完成一半:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- Crash here, or ROLLBACK: account 1 is unchanged.一致性
约束(NOT NULL、CHECK、FK)会在 COMMIT 时检查。如果事务会使数据库处于无效状态,就会失败:
BEGIN;
INSERT INTO orders (user_id, total) VALUES (999, 100); -- FK fails on commit if user 999 doesn't exist.
COMMIT;
-- ERROR: insert or update violates foreign key constraint
-- ROLLBACK happens automatically.隔离性:为何重要
没有隔离性时,两个并发事务可能会破坏彼此看到的数据。典型异常包括:
- 脏读 — 读取尚未 COMMIT 的数据
- 不可重复读 — 同一个查询返回不同的行
- 幻读 — 事务进行期间出现新行
- 丢失更新 — 两次 UPDATE 互相覆盖
脏读
读取另一个事务已经修改但尚未 COMMIT 的行。PostgreSQL 在所有隔离级别下都会阻止这种情况。
不可重复读
您读取了第 1 行,另一个事务 COMMIT 了对第 1 行的 UPDATE,您再次读取时,值已经不同。
幻读
您在一个事务中两次执行 SELECT COUNT(*)。两次调用之间,另一个事务 COMMIT 了一个 INSERT——您第二次统计的数量更大。
丢失更新
两个事务都读取 balance=100,都写入 balance=balance-50,并且都 COMMIT——其中一次 -50 的更新丢失了。
持久性
一旦 COMMIT 返回,更改就已经写入磁盘(或者已经复制,具体取决于设置)。即使一毫秒后发生崩溃,更改也不会丢失。PostgreSQL 通过 WAL(预写式日志)实现持久性。
自动提交
默认情况下,每条语句都是一个独立的事务:
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- Implicitly: BEGIN; statement; COMMIT;SAVEPOINT
在事务中进行部分回滚:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
SAVEPOINT before_step2;
UPDATE accounts SET balance = balance + 100 WHERE id = 999;
-- ERROR — but we can recover:
ROLLBACK TO SAVEPOINT before_step2;
-- continue
COMMIT;回顾
事务是关系型数据库的安全保障。
- ACID:原子、一致、隔离、持久
- 四种经典异常
- BEGIN ... COMMIT 或 ROLLBACK
- 使用 SAVEPOINT 进行部分回滚
快速检查
当两个事务都读取同一个值、修改该值并 COMMIT 时,会发生什么异常?
常见问题解答
「ACID 属性与异常」课时是免费的吗?
是的 — 「ACID 属性与异常」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「ACID 属性与异常」这节课中我会学到什么?
复习原子性、一致性、隔离性和持久性,以及四种经典异常:脏读、不可重复读、幻读和丢失更新 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「ACID 属性与异常」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。