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;

行为: 如果两个事务冲突,其中一个会因错误而中止,而不是静默等待,从而防止潜在异常。

要点

隔离确保并发事务不会相互干扰各自的中间状态。即使多个用户同时尝试修改同一账户,数据库也能保持一致性并防止数据损坏。

0 浏览
Back to Blog

相关文章

阅读更多 »

修改表

1. 将 customers 表的 email 列设为 NOT NULL:ALTER TABLE customers ALTER COLUMN email SET NOT NULL; 2. 确保 users 表的 username 唯一:ALTER TABLE …