PostgreSQL中事务的ACID特性是什么?
在 PostgreSQL 中,事务的 ACID 特性是确保数据库可靠性和数据一致性的核心原则。以下是 ACID 特性的具体说明:
1. 原子性(Atomicity)
- 定义:事务中的所有操作要么全部成功提交(
COMMIT),要么全部回滚(ROLLBACK),不会出现部分执行的情况。 - PostgreSQL 实现:
- 通过 ** 预写式日志(WAL, Write-Ahead Logging)** 记录事务的所有修改。
- 若事务执行过程中发生故障(如断电),系统重启后会根据 WAL 回滚未提交的事务或提交已写入 WAL 的事务。
示例:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
- 如果第二个
UPDATE失败,整个事务会回滚,两个账户的余额保持不变。
2. 一致性(Consistency)
- 定义:事务执行前后,数据库的完整性约束(如主键、外键、唯一约束)保持不变。
- PostgreSQL 实现:
- 通过约束检查和触发器确保数据一致性。
- 事务提交时,所有约束必须满足,否则回滚。
- 示例:
CREATE TABLE users ( id SERIAL PRIMARY KEY, email VARCHAR(255) UNIQUE ); BEGIN; INSERT INTO users (email) VALUES ('user@example.com'); -- 第一次插入成功 INSERT INTO users (email) VALUES ('user@example.com'); -- 违反唯一约束,事务回滚
3. 隔离性(Isolation)
- 定义:多个并发事务之间相互隔离,一个事务的执行不会影响其他事务。
- PostgreSQL 实现:
- 通过 ** 多版本并发控制(MVCC, Multi-Version Concurrency Control)** 实现高并发下的隔离性。
- 支持四种隔离级别:
READ COMMITTED(默认)、REPEATABLE READ、SERIALIZABLE。
- 示例:
- 读已提交(
READ COMMITTED):事务只能读取已提交的数据,避免脏读。 - 可重复读(
REPEATABLE READ):事务内多次读取结果一致,避免不可重复读。 - 可串行化(
SERIALIZABLE):完全避免脏读、不可重复读和幻读,通过冲突检测保证串行化执行。
- 读已提交(
4. 持久性(Durability)
- 定义:一旦事务提交,其修改将永久保存,即使系统崩溃或发生故障。
- PostgreSQL 实现:
- 事务提交时,WAL 记录会被强制写入磁盘。
- 系统崩溃后,通过回放 WAL 日志恢复已提交的事务。
- 示例:
- 执行
COMMIT后,即使数据库服务器断电,重启后仍能通过 WAL 恢复已提交的数据。
- 执行
总结
| 特性 | 描述 | PostgreSQL 机制 |
|---|---|---|
| 原子性 | 事务操作要么全成功,要么全失败。 | 预写式日志(WAL) |
| 一致性 | 事务执行前后,数据符合完整性约束。 | 约束检查、触发器 |
| 隔离性 | 并发事务互不干扰。 | MVCC、隔离级别(READ COMMITTED等) |
| 持久性 | 已提交的事务数据永久保存。 | WAL 持久化 |
通过 ACID 特性,PostgreSQL 确保了复杂业务场景下的数据可靠性和一致性。
浙公网安备 33010602011771号