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 READSERIALIZABLE
  • 示例:
    • 读已提交(READ COMMITTED):事务只能读取已提交的数据,避免脏读。
    • 可重复读(REPEATABLE READ):事务内多次读取结果一致,避免不可重复读。
    • 可串行化(SERIALIZABLE):完全避免脏读、不可重复读和幻读,通过冲突检测保证串行化执行。

4. 持久性(Durability)

  • 定义:一旦事务提交,其修改将永久保存,即使系统崩溃或发生故障。
  • PostgreSQL 实现:
    • 事务提交时,WAL 记录会被强制写入磁盘。
    • 系统崩溃后,通过回放 WAL 日志恢复已提交的事务。
  • 示例:
    • 执行COMMIT后,即使数据库服务器断电,重启后仍能通过 WAL 恢复已提交的数据。

总结

特性描述PostgreSQL 机制
原子性 事务操作要么全成功,要么全失败。 预写式日志(WAL)
一致性 事务执行前后,数据符合完整性约束。 约束检查、触发器
隔离性 并发事务互不干扰。 MVCC、隔离级别(READ COMMITTED等)
持久性 已提交的事务数据永久保存。 WAL 持久化

通过 ACID 特性,PostgreSQL 确保了复杂业务场景下的数据可靠性和一致性。

posted on 2025-04-04 16:30  阿陶学长  阅读(161)  评论(0)    收藏  举报