CA 36 – 隔离 (ACID)
发布: (2026年3月29日 GMT+8 18:36)
2 分钟阅读
原文: Dev.to
Source: Dev.to
场景
该实验演示了 Isolation(隔离)属性在两个会话同时对同一账户进行操作时的工作方式。
步骤
会话 1
BEGIN;
UPDATE accounts
-- (no COMMIT yet)会话 2
SELECT * FROM accounts WHERE name = 'Alice';结果: 余额仍显示 1000,而不是未提交的值(例如 200)。
UPDATE accounts
-- (this statement blocks, waiting for Session 1 to finish)在会话 1 中提交
COMMIT;提交后,会话 2 被阻塞的 UPDATE 将继续执行,使用新提交的值。最终余额反映了两个事务的合并效果。
更改隔离级别
READ COMMITTED(默认)
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;行为: 与上面相同——没有脏读;会话 2 只能看到已提交的数据。
SERIALIZABLE
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;行为: 如果两个事务冲突,其中一个会因错误而中止,而不是静默等待,从而防止潜在异常。
要点
隔离确保并发事务不会相互干扰各自的中间状态。即使多个用户同时尝试修改同一账户,数据库也能保持一致性并防止数据损坏。