PostgreSQL ACID实战指南:第一部分

这篇实践教程详细展示了如何在PostgreSQL中实现ACID特性,包括原子性、一致性、隔离性和持久性的实际演示,帮助开发者深入理解数据库事务处理机制。

动手实践PostgreSQL中的ACID特性:第一部分

本实验适合那些对PostgreSQL了解不多但想实际看到事务、回滚、隔离性和持久性在现实中如何工作的人。

🧠 第0步:如果你从未使用过PostgreSQL…

在开始本实验之前,请确保你知道如何打开psql并创建一个简单的数据库。如果不会,请先从这里开始:PostgreSQL初学者指南

该指南向你展示:

  • 如何使用psql连接,创建你的第一个数据库和表
  • 常见的初学者错误(以及如何修复它们)

一旦你可以运行:

1
psql -U postgres

并看到postgres=#提示符——你就准备好开始这个ACID实验了!

你将学到什么

通过本实验,你将看到并理解ACID模型的所有4个部分:

属性 含义 你将看到它在实际操作中
原子性 全有或全无的事务 回滚演示
一致性 约束保持数据有效 检查约束演示
隔离性 事务互不干扰 两个会话测试
持久性 已提交的数据保持保存 重启后检查

⚙️ 实验设置

假设:

  • PostgreSQL已安装且psql工作正常
  • 我们将使用两个终端窗口:
    • 会话A → 进行更改
    • 会话B → 从另一个用户角度观察
  • 用户:postgres

✅ 创建数据库和表

在Git Bash终端中运行一次:

1
2
psql -U postgres
CREATE DATABASE acid_lab;

现在进入数据库:

1
2
postgres=# \c acid_lab
acid_lab=#

然后在psql中:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
CREATE TABLE accounts (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  balance NUMERIC(12,2) NOT NULL CHECK (balance >= 0)
);

INSERT INTO accounts (name, balance) VALUES
('A', 1000.00),
('B', 1000.00);

SELECT * FROM accounts ORDER BY id;

预期输出:

1
2
3
4
5
 id | name | balance
----+------+---------
  1 | A    | 1000.00
  2 | B    | 1000.00
(2 rows)

📸 标题:“初始数据——两个账户分别从1000开始”

🧩 1. 原子性——全有或全无规则

打开会话A并开始一个事务:

1
2
3
4
BEGIN;
UPDATE accounts SET balance = balance - 200 WHERE id = 1;
UPDATE accounts SET balance = balance - 200 WHERE id = 2;
SELECT * FROM accounts;

会话A内的输出:

1
2
 1 | A | 800.00
 2 | B | 800.00

现在打开会话B(新终端):

1
SELECT * FROM accounts;

会话B中的输出(未改变):

1
2
 1 | A | 1000.00
 2 | B | 1000.00

📸 “未提交的更改对其他会话不可见。”

现在在会话A中回滚:

1
2
ROLLBACK;
SELECT * FROM accounts;

输出:

1
2
 1 | A | 1000.00
 2 | B | 1000.00

📸 “原子性——没有部分更改。”

如果不回滚而是写COMMIT,更改可以在两个终端中看到。

📸 “原子性——完全更改。”

下一部分我们将看到…

🌐 连接与分享

如果这个实验对你有帮助,请留言或分享你的截图—— 让我们连接并一起构建 💬

🐙 GitHub – @sajjadrahman56 💼 LinkedIn – 与我连接 🐦 X (Twitter) – @sajjadrahman56 📺 YouTube – 数据工程师的教程和技巧

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计