暂无图片
分享
suger
2023-05-20
长事务的危害以及如何溯源长事务

长事务的危害以及如何溯源长事务

收藏
分享
2条回答
默认
最新
T
Ty3306

长事务的危害

小事务但长期不提交:

如果前面执行过DML语句,会锁定相关数据,阻塞后面语句
阻塞create index(也包括 concurrently)
大量死元组无法vacuum,导致表膨胀
大量事务id无法冻结
WAL无法及时清理,占用空间大
占用连接数
开启old_snapshot_threshold后,长事务可能导致索引失效
搭配子事务容易使性能急剧下降
逻辑复制下会阻塞复制槽的创建
大事务:除上面外可能还有

出现较大范围锁表
WAL大量增加
主从出现延迟
溯源

什么样的事务才会是有危害的长事务?

pg_stat_activity视图中 backend_xid或backend_xmin字段非空的事务。单纯begin tran; 不提交并不会有问题,因为它并没有真正申请事务id和获取快照。

backend_xid:已申请的事务号(virtualxid不算),从申请事务号开始持续到事务结束。

backend_xmin:进程快照xmin,表示在快照创建时最旧的未提交事务id(实际上就是Transaction Horizon)

因此监控语句需要加上这两个条件

select count(*) from pg_stat_activity where state <> 'idle'
and (backend_xid is not null or backend_xmin is not null)
and now()-xact_start > interval '3600 sec'::interval 

暂无图片 评论
暂无图片 有用 0
暂无图片
suger
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏