设计一个可靠的钱包转账系统,具备 ACID 保证 pt - 4(持久性)
发布: (2026年3月29日 GMT+8 17:26)
2 分钟阅读
原文: Dev.to
Source: Dev.to
持久性
持久性确保一旦事务成功提交,其更改会永久存储在数据库中,即使系统发生故障也不例外。
模式
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 INTO accounts (name, balance)
VALUES ('Alice', 1000), ('Bob', 500);初始余额: Alice = 1000,Bob = 500。
事务测试
BEGIN;
UPDATE accounts
SET balance = balance - 200
WHERE name = 'Alice';
COMMIT;在 COMMIT 之后,Alice 的余额变为 800,且该更改被永久保存。
验证持久性
- 在提交后立即模拟崩溃。
- 重启数据库。
- 查询 Alice 的余额;它应仍为 800。
如果在重启后提交的数据仍然存在,则持久性得到确认。
持久性实现方式
- 预写日志(WAL) 在将更改写入数据文件之前记录这些更改。
- 磁盘存储 确保日志和数据页被刷新到稳定介质。
- 崩溃恢复 在启动时处理 WAL,重做任何尚未写入磁盘的已提交事务。
这些机制保证一旦事务提交,其效果能够在后续的任何故障中存活。