设计一个可靠的钱包转账系统,具备 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)。
- 每个更新都基于过时的数据进行。
- 这可能导致错误的最终余额(竞争条件)。
有适当的隔离
- 一个事务在另一个事务影响同一行之前完成或执行。
- 第二个事务要么等待,要么看到已更新的值。
- 防止不一致的更新,最终余额保持正确。
机制
隔离通过以下机制实现:
- 乐观锁 – 在提交前检查冲突。
- 悲观锁 – 获取锁,阻止其他事务直到锁被释放。
当数据库阻止两个事务相互干扰并保持正确结果时,说明隔离已按预期工作。