设计一个可靠的钱包转账系统,具备 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,且该更改被永久保存。

验证持久性

  1. 在提交后立即模拟崩溃。
  2. 重启数据库。
  3. 查询 Alice 的余额;它应仍为 800

如果在重启后提交的数据仍然存在,则持久性得到确认。

持久性实现方式

  • 预写日志(WAL) 在将更改写入数据文件之前记录这些更改。
  • 磁盘存储 确保日志和数据页被刷新到稳定介质。
  • 崩溃恢复 在启动时处理 WAL,重做任何尚未写入磁盘的已提交事务。

这些机制保证一旦事务提交,其效果能够在后续的任何故障中存活。

0 浏览
Back to Blog

相关文章

阅读更多 »

CA 36 – 隔离 (ACID)

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

耐久性

Durability 意味着一旦 transaction 成功 committed,其 changes 永久保存于 database 中。即使系统崩溃,...

幂等性情况

确保使用数据库事务进行可靠的资金转账 在类似 PhonePe、Google Pay 或 Paytm 的数字钱包系统中,用户期望他们的资金能够...