92人参与 • 2025-06-16 • MsSqlserver
postgresql 使用多版本并发控制(mvcc)作为其核心并发控制机制,这是它与许多其他数据库系统的关键区别之一。mvcc 允许读操作不阻塞写操作,写操作也不阻塞读操作,从而提供高度并发性。
| 特性 | 传统锁机制 | mvcc |
|---|---|---|
| 读-写冲突 | 读写互相阻塞 | 读写不互相阻塞 |
| 并发度 | 较低 | 较高 |
| 实现复杂度 | 相对简单 | 较复杂 |
| 存储开销 | 较小 | 较大(需要版本存储) |
postgresql 每行数据都包含几个隐藏的系统列:
select xmin, xmax, cmin, cmax, ctid, * from your_table;
postgresql 通过比较事务id(xmin, xmax)和事务快照来判断行版本是否可见:
vacuum过程冻结旧的事务id-- 事务1 begin; insert into test values (1, 'data'); -- 此时xmin=当前事务id, xmax=0 commit;
-- 事务2 begin; update test set value = 'new' where id = 1; -- 原行xmax设置为事务2的id -- 新行xmin=事务2的id, xmax=0 commit;
-- 事务3 begin; delete from test where id = 1; -- 行xmax设置为事务3的id commit;
oid)存储当前行版本-- 查看当前事务快照 select pg_current_snapshot(); -- 输出示例: 100:100: -- 格式为 xmin:xmax:xip_list
-- 常规vacuum(不锁表) vacuum [verbose] [analyze] table_name; -- 全量vacuum(需要锁) vacuum full [verbose] table_name;
vacuum作用:
-- 查看自动vacuum设置 select name, setting from pg_settings where name like 'autovacuum%'; -- 重要参数 autovacuum = on -- 是否启用 autovacuum_vacuum_threshold = 50 -- 触发vacuum的更新/删除元组阈值 autovacuum_analyze_threshold = 50 -- 触发analyze的更新/删除元组阈值 autovacuum_vacuum_scale_factor = 0.2-- 表大小的缩放因子
-- 对大表调整autovacuum参数 alter table large_table set ( autovacuum_vacuum_scale_factor = 0.05, autovacuum_vacuum_threshold = 10000 );
-- 查看表膨胀情况 select schemaname, relname, pg_size_pretty(pg_relation_size(relid)) as size, n_dead_tup, n_live_tup from pg_stat_user_tables order by n_dead_tup desc;
-- 对大表定期手动vacuum vacuum (verbose, analyze) large_table; -- 在低峰期执行vacuum full vacuum full verbose table_name;
到此这篇关于postgresql中mvcc 机制的实现的文章就介绍到这了,更多相关postgresql mvcc机制 内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论