设计一个可靠的钱包转账系统,具备 ACID 保证 pt - 3(隔离)

发布: (2026年3月29日 GMT+8 17:07)
2 分钟阅读
原文: Dev.to

Source: Dev.to

隔离

确保多个事务能够独立执行而不相互干扰,即使在并发运行时也是如此。

设置

-- Create the accounts table
CREATE TABLE accounts (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    balance INT NOT NULL CHECK (balance >= 0),
    last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Insert dummy data
INSERT INTO accounts (name, balance)
VALUES ('Alice', 1000), ('Bob', 500);

初始余额:

  • Alice = 1000
  • Bob = 500

测试隔离

事务 1

BEGIN;

UPDATE accounts
SET balance = balance - 500
WHERE name = 'Alice';

事务 2(并发运行)

BEGIN;

UPDATE accounts
SET balance = balance - 700
WHERE name = 'Alice';

没有适当的隔离

  • 两个事务可能读取相同的初始余额(1000)。
  • 每个更新都基于过时的数据进行。
  • 这可能导致错误的最终余额(竞争条件)。

有适当的隔离

  • 一个事务在另一个事务影响同一行之前完成或执行。
  • 第二个事务要么等待,要么看到已更新的值。
  • 防止不一致的更新,最终余额保持正确。

机制

隔离通过以下机制实现:

  • 乐观锁 – 在提交前检查冲突。
  • 悲观锁 – 获取锁,阻止其他事务直到锁被释放。

当数据库阻止两个事务相互干扰并保持正确结果时,说明隔离已按预期工作。

0 浏览
Back to Blog

相关文章

阅读更多 »

ALTER 查询

在本次作业中,我使用 ALTER TABLE 对现有表进行修改。这帮助我了解了如何在不重新创建表的情况下更新约束。任务……

CA 36 – 隔离 (ACID)

场景:该实验演示了 ACID 中 Isolation(隔离)属性在两个会话尝试并发操作同一账户时的工作方式。步骤:会话…