0Pricing
SQL Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. ACID 属性与异常
  2. 隔离级别:READ COMMITTED、REPEATABLE READ、SERIALIZABLE
  3. 死锁:检测与避免
  4. 乐观锁与悲观锁
← 返回 SQL Academy