PostgreSQL教程FG212-PG事务日志:ACID特性与事务管理
本文档风哥主要介绍PostgreSQL数据库的事务管理,包括ACID特性、事务日志、事务隔离级别等内容,风哥教程参考PostgreSQL官方文档Transaction Processing内容,适合数据库管理员和开发者在学习和测试中使用。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 PostgreSQL事务概念
事务是数据库操作的一个逻辑单元,由一系列操作组成,这些操作要么全部执行成功,要么全部执行失败。PostgreSQL支持事务的开始、提交和回滚操作,确保数据的一致性和完整性。
- 原子性:事务是一个不可分割的工作单位
- 一致性:事务执行前后,数据库状态保持一致
- 隔离性:多个事务并发执行时,相互隔离
- 持久性:事务提交后,数据修改永久保存
1.2 PostgreSQL ACID特性
PostgreSQL的ACID特性详细说明:
- 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败回滚
- 一致性(Consistency):事务执行前后,数据库从一个一致性状态转换到另一个一致性状态
- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务
- 持久性(Durability):事务提交后,其结果永久保存在数据库中
1.3 PostgreSQL事务日志
PostgreSQL的事务日志(Transaction Log)是WAL(Write-Ahead Logging)的一部分,用于记录事务的修改操作,确保事务的ACID特性。事务日志的主要作用包括:
- 崩溃恢复:在数据库崩溃后,通过重放事务日志恢复数据
- 事务回滚:支持事务的回滚操作
- 复制:用于主从复制
- 时间点恢复:结合WAL归档实现时间点恢复
Part02-生产环境规划与建议
2.1 PostgreSQL事务配置
PostgreSQL事务配置建议:
# 事务隔离级别
default_transaction_isolation = ‘read committed’ # 默认隔离级别
# 事务超时
idle_in_transaction_session_timeout = 60000 # 60秒
# 锁超时
lock_timeout = 0 # 无超时
# 死锁检测
deadlock_timeout = 1s # 死锁检测超时
# 事务同步
synchronous_commit = on # 同步提交
# 示例:修改事务隔离级别
SET default_transaction_isolation = ‘repeatable read’;
2.2 PostgreSQL事务性能优化
PostgreSQL事务性能优化建议:
# 事务管理优化
– 减少事务长度:避免长事务
– 批量操作:使用批量插入和更新
– 合理使用事务:避免不必要的事务
– 适当使用保存点:用于复杂事务
# 并发控制优化
– 选择合适的隔离级别
– 减少锁竞争:合理设计表结构和索引
– 使用乐观并发控制:适用于读多写少的场景
– 避免全表扫描:使用索引
# 示例:批量插入
BEGIN;
INSERT INTO fgedu_fgedus (fgeduname, email) VALUES
(‘fgedu1’, ‘fgedu1@fgedu.net.cn’),
(‘fgedu2’, ‘fgedu2@fgedu.net.cn’),
(‘fgedu3’, ‘fgedu3@fgedu.net.cn’);
COMMIT;
# 示例:使用保存点
BEGIN;
INSERT INTO fgedu_orders (customer_id, amount) VALUES (1, 100);
SAVEPOINT sp1;
INSERT INTO fgedu_order_items (order_id, product_id, quantity) VALUES (1, 1, 2);
ROLLBACK TO sp1;
INSERT INTO fgedu_order_items (order_id, product_id, quantity) VALUES (1, 2, 1);
COMMIT;
2.3 PostgreSQL事务监控
PostgreSQL事务监控建议:
- 活跃事务:监控当前活跃的事务
- 长事务:监控运行时间过长的事务
- 锁定情况:监控锁的使用情况
- 死锁:监控死锁事件
- 事务统计:监控事务的执行统计
Part03-生产环境项目实施方案
3.1 PostgreSQL事务管理
3.1.1 事务控制语句
# 开始事务
BEGIN;
— 或
START TRANSACTION;
# 提交事务
COMMIT;
# 回滚事务
ROLLBACK;
# 保存点
SAVEPOINT savepoint_name;
ROLLBACK TO savepoint_name;
RELEASE SAVEPOINT savepoint_name;
# 设置事务属性
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN TRANSACTION READ WRITE;
BEGIN TRANSACTION DEFERRABLE;
3.1.2 事务状态管理
# 查看当前事务状态
SELECT
txid_current(),
current_transaction_id();
# 查看活跃事务
SELECT
pid,
usename,
fgapplication_name,
client_addr,
state,
query_start,
now() – query_start AS duration,
query
FROM pg_stat_activity
WHERE state = ‘active’;
# 终止长事务
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE now() – query_start > interval ‘5 minutes’
AND state = ‘active’;
3.2 PostgreSQL事务隔离级别
3.2.1 隔离级别的类型
# 隔离级别类型
– READ UNCOMMITTED:读未提交
– READ COMMITTED:读已提交(默认)
– REPEATABLE READ:可重复读
– SERIALIZABLE:可串行化
# 隔离级别的设置
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED;
# 查看当前隔离级别
SHOW transaction_isolation;
# 不同隔离级别的特点
– READ UNCOMMITTED:可能读取到未提交的数据(脏读)
– READ COMMITTED:只能读取到已提交的数据,可能出现不可重复读
– REPEATABLE READ:确保同一事务中多次读取相同数据结果一致,可能出现幻读
– SERIALIZABLE:最高隔离级别,确保事务串行执行
3.2.2 隔离级别的选择
# 读已提交(默认)
– 适用场景:大多数应用
– 特点:并发性能好,避免脏读
– 缺点:可能出现不可重复读和幻读
# 可重复读
– 适用场景:需要一致性读取的应用
– 特点:确保同一事务中读取结果一致
– 缺点:并发性能略有下降
# 可串行化
– 适用场景:需要最高一致性的应用
– 特点:确保事务串行执行
– 缺点:并发性能较低
# 示例:设置隔离级别
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT * FROM fgedu_fgedus WHERE id = 1;
— 其他操作
COMMIT;
3.3 PostgreSQL事务恢复
3.3.1 崩溃恢复
# 崩溃恢复过程
1. 数据库启动时,自动执行恢复
2. 重放未提交的WAL记录
3. 回滚未提交的事务
4. 确保数据一致性
# 查看恢复状态
SELECT
pg_is_in_recovery(),
pg_last_wal_replay_lsn(),
pg_last_wal_replay_time();
# 强制检查点
CHECKPOINT;
3.3.2 时间点恢复(PITR)
# 准备工作
– 启用WAL归档
– 定期备份基础备份
# 恢复步骤
1. 停止数据库
2. 还原基础备份
3. 创建recovery.conf文件
4. 启动数据库,开始恢复
5. 恢复到指定时间点后停止
# recovery.conf示例
recovery_target = ‘2024-01-01 12:00:00’
recovery_target_timeline = ‘latest’
restore_command = ‘cp /archive/%f %p’
# 查看恢复进度
SELECT
pg_is_in_recovery(),
pg_last_wal_replay_lsn(),
pg_last_wal_replay_time();
Part04-生产案例与实战讲解
4.1 PostgreSQL事务实战案例
4.1.1 银行转账案例
# 创建表结构
CREATE TABLE fgedu_accounts (
id SERIAL PRIMARY KEY,
account_number VARCHAR(20) UNIQUE NOT NULL,
balance NUMERIC(10,2) NOT NULL
);
# 插入测试数据
INSERT INTO fgedu_accounts (account_number, balance) VALUES
(‘A001’, 10000.00),
(‘A002’, 5000.00);
# 转账事务
BEGIN;
— 检查余额
SELECT balance FROM fgedu_accounts WHERE account_number = ‘A001’;
— 执行转账
UPDATE fgedu_accounts SET balance = balance – 1000.00 WHERE account_number = ‘A001’;
UPDATE fgedu_accounts SET balance = balance + 1000.00 WHERE account_number = ‘A002’;
— 验证结果
SELECT * FROM fgedu_accounts;
— 提交事务
COMMIT;
# 执行结果
account_number | balance
—————+——–
A001 | 9000.00
A002 | 6000.00
4.2 PostgreSQL事务工具使用
4.2.1 使用pg_stat_activity监控事务
# 查看活跃事务
SELECT
pid,
usename,
fgapplication_name,
client_addr,
state,
query_start,
now() – query_start AS duration,
query
FROM pg_stat_activity
WHERE state = ‘active’;
# 查看长事务
SELECT
pid,
usename,
fgapplication_name,
client_addr,
state,
query_start,
now() – query_start AS duration,
query
FROM pg_stat_activity
WHERE now() – query_start > interval ‘5 minutes’
AND state = ‘active’;
# 终止长事务
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE now() – query_start > interval ’10 minutes’
AND state = ‘active’;
4.3 PostgreSQL事务常见问题
PostgreSQL事务常见问题及解决方法:
# 症状:事务运行时间过长
# 解决方法
– 优化事务逻辑,减少事务长度
– 拆分大事务为小事务
– 设置idle_in_transaction_session_timeout
– 定期监控和终止长事务
# 常见问题2:死锁
# 错误信息
ERROR: deadlock detected
DETAIL: Process 1234 waits for ShareLock on transaction 5678; blocked by process 5678.
Process 5678 waits for ShareLock on transaction 1234; blocked by process 1234.
# 解决方法
– 避免循环依赖
– 统一锁顺序
– 使用较短的事务
– 适当使用索引减少锁范围
– 设置deadlock_timeout
# 常见问题3:锁竞争
# 症状:事务等待锁时间过长
# 解决方法
– 优化查询,减少锁持有时间
– 使用合适的隔离级别
– 避免全表扫描
– 合理设计表结构和索引
– 考虑使用乐观并发控制
Part05-风哥经验总结与分享
5.1 PostgreSQL事务最佳实践
PostgreSQL事务最佳实践:
- 保持事务简短:避免长事务,减少锁持有时间
- 合理使用批量操作:减少事务数量
- 选择合适的隔离级别:根据业务需求选择
- 避免不必要的事务:只在需要时使用事务
- 使用保存点:用于复杂事务的部分回滚
- 监控事务执行:及时发现和解决问题
- 优化锁使用:减少锁竞争
- 定期维护:执行VACUUM和ANALYZE
5.2 PostgreSQL事务检查清单
– [ ] 事务长度是否合理
– [ ] 隔离级别是否选择正确
– [ ] 锁竞争是否严重
– [ ] 死锁是否频繁发生
– [ ] 长事务是否存在
– [ ] 事务监控是否到位
– [ ] 事务性能是否优化
– [ ] 事务恢复是否测试
# 事务维护清单
– [ ] 定期监控活跃事务
– [ ] 定期清理长事务
– [ ] 定期分析事务执行情况
– [ ] 定期测试事务恢复
– [ ] 优化事务逻辑
– [ ] 调整事务配置参数
5.3 PostgreSQL事务工具推荐
PostgreSQL事务工具推荐:
- pg_stat_activity:查看活跃事务
- pg_locks:查看锁信息
- pg_stat_statements:查看SQL执行统计
- pg_terminate_backend:终止后台进程
- pg_cancel_backend:取消后台进程
- pg_waldump:查看WAL内容
- CHECKPOINT:执行检查点
- EXPLAIN ANALYZE:分析SQL执行计划
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
