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. 💡 并发控制最佳实践
- 使用适当的隔离级别 - 默认READ COMMITTED通常够用
- 保持事务简短 - 减少锁持有时间
- 避免长事务 - 防止表膨胀
- 使用乐观锁 - version字段控制并发
6. 📚 下一步
学习窗口函数应用
关键要点:
- BEGIN…COMMIT包裹事务
- READ COMMITTED是默认隔离级别
- 使用FOR UPDATE进行行锁
- 避免长事务
xingliuhua