目录

pgsql-14 事务与并发控制

14 - 事务与并发控制

1. 📖 概述

事务是数据库操作的基本单位,本章介绍PostgreSQL的事务管理和并发控制机制。

2. 🔒 事务基础

2.1 ACID特性

  • Atomicity(原子性): 全部成功或全部失败
  • Consistency(一致性): 数据保持一致状态
  • Isolation(隔离性): 并发事务相互隔离
  • Durability(持久性): 提交后永久保存

2.2 事务操作

-- 开始事务
BEGIN;

-- 执行操作
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

-- 提交事务
COMMIT;

-- 回滚事务(出错时)
ROLLBACK;

-- 保存点
BEGIN;
UPDATE products SET price = 99.99 WHERE id = 1;
SAVEPOINT my_savepoint;
UPDATE products SET price = 199.99 WHERE id = 2;
ROLLBACK TO my_savepoint;  -- 只回滚到保存点
COMMIT;

3. 🔐 隔离级别

PostgreSQL支持4种隔离级别:

隔离级别 脏读 不可重复读 幻读 性能
READ UNCOMMITTED
READ COMMITTED (默认) 较高
REPEATABLE READ 较低
SERIALIZABLE
-- 设置事务隔离级别
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT * FROM products WHERE id = 1;
-- ...
COMMIT;

-- 会话级别设置
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE;

4. 🚦 锁机制

-- 行级锁
SELECT * FROM products WHERE id = 1 FOR UPDATE;  -- 排他锁
SELECT * FROM products WHERE id = 1 FOR SHARE;   -- 共享锁

-- 表级锁
LOCK TABLE products IN EXCLUSIVE MODE;

-- 查看锁
SELECT * FROM pg_locks;

5. 💡 并发控制最佳实践

  1. 使用适当的隔离级别 - 默认READ COMMITTED通常够用
  2. 保持事务简短 - 减少锁持有时间
  3. 避免长事务 - 防止表膨胀
  4. 使用乐观锁 - version字段控制并发

6. 📚 下一步

学习窗口函数应用


关键要点:

  • BEGIN…COMMIT包裹事务
  • READ COMMITTED是默认隔离级别
  • 使用FOR UPDATE进行行锁
  • 避免长事务