PostgreSQL怎么查看当前正在执行的长事务及等待的锁类型

夜强酱_7792

夜强酱_7792

2026-10-15

212人浏览

原创

postgresql中需用now()-xact_start计算事务运行时长,重点排查state='idle in transaction'的长事务,并联查pg_locks定位锁等待链,避免误杀应优先使用pg_cancel_backend。

postgresql怎么查看当前正在执行的长事务及等待的锁类型

查 pg_stat_activity 看长事务的 backend_start 和 xact_start

PostgreSQL 没有“事务运行时长”直接字段,得靠时间差推算。重点看 xact_start(事务开始时间)和当前时间的差值,比 backend_start(连接建立时间)更准——因为一个连接可能空闲很久才开启事务。

实操建议:

  • 用 now() - xact_start 计算持续秒数,过滤掉 xact_start IS NULL(即未在事务中)的行
  • state = 'active' 不能代表事务长,只表示后端正在执行某条语句;真正要抓的是 state = 'idle in transaction' 且持续很久的会话——这往往是应用没提交/回滚导致的悬挂事务
  • 加 ORDER BY xact_start 降序,一眼看到最老的事务
SELECT pid, usename, datname, client_addr,
       now() - xact_start AS xact_duration,
       state, query
FROM pg_stat_activity
WHERE xact_start IS NOT NULL
  AND now() - xact_start > interval '5 minutes'
ORDER BY xact_start;

联查 pg_locks 判断谁在等什么锁、谁持有锁

单看 pg_stat_activity 只知道“有长事务”,但不知道它卡在哪。必须关联 pg_locks 才能定位锁等待链:谁在等锁(granted = false),谁持有锁(granted = true),锁类型(locktype)和对象(relation、page、tuple 等)。

关键点:

Tbox
Tbox

Tbox是一款AI智能体工具,蚂蚁集团旗下多智能体协同的通用 AI Agent。

下载
  • pg_locks.pid 对应 pg_stat_activity.pid,这是关联依据
  • mode 字段显示锁级别,如 RowExclusiveLock、ShareLock、AccessExclusiveLock;其中 AccessExclusiveLock 最重,通常阻塞所有其他操作
  • 若 granted = false 且存在同 locktype+database+relation 的 granted = true 记录,就构成明确等待关系
SELECT blocked_locks.pid AS blocked_pid,
       blocked_activity.usename AS blocked_user,
       blocking_locks.pid AS blocking_pid,
       blocking_activity.usename AS blocking_user,
       blocked_activity.query AS blocked_query,
       blocking_activity.query AS current_statement_in_blocking_process,
       blocked_locks.mode AS blocked_mode,
       blocking_locks.mode AS blocking_mode
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks 
  ON blocking_activity.pid = blocking_locks.pid
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted
  AND blocking_locks.granted;

识别常见危险锁类型和对应场景

不是所有锁都危险,但某些组合极易引发级联阻塞。重点关注:

  • AccessExclusiveLock:DDL(如 ALTER TABLE、DROP INDEX)或 TRUNCATE 持有,会阻塞所有并发读写;一旦被长事务持有,整个表基本不可用
  • RowExclusiveLock + tuple 级别锁:通常来自 UPDATE/DELETE 语句,若事务未结束,该行持续被锁,其他会话更新同一行就会卡住
  • ShareLock 或 ShareRowExclusiveLock:常见于 CREATE INDEX CONCURRENTLY 建索引期间,若建索引被长事务拖住,会一直等待 AccessShareLock 释放

注意:locktype = 'virtualxid' 或 'transactionid' 属于内部事务 ID 锁,一般不直接导致业务阻塞,可先忽略。

避免误杀:kill 前先确认事务是否真可中断

pg_terminate_backend(pid) 能强行断开连接,但风险不小:

  • 若事务正在执行大事务(如大批量 UPDATE),中断可能导致部分数据已改、部分未改,应用层无感知,产生数据不一致
  • 某些客户端(如 JDBC)默认启用 autosave=conservative,kill 后重连可能自动重放未完成语句,造成重复执行
  • 优先尝试 SELECT pg_cancel_backend(pid) 发送取消信号——它只中断当前查询,不杀连接,事务仍保持 idle in transaction 状态,留给应用自行处理

真正需要 pg_terminate_backend 的,通常是 idle in transaction 超过 30 分钟、且确认应用无响应的悬挂事务。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、\l、\c、\dt、\d table_name、\du、\i file_name、\e和\q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.10

233

5

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4449

19

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、\l、\c、\dt、\d table_name、\du、\i file_name、\e和\q等。更详细的postgresql常用命令,大家可以访问下面的文章。

2023.11.16

647

3

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有\l、\d、\d5、\di、\ds、\dv、\df、\dn、\db、\dg、\dp、\c、\pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

2023.11.20

1396

6

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

2026.02.12

460

19

PostgreSQL 性能优化与查询执行计划实战
PostgreSQL 性能优化与查询执行计划实战

本专题深入解析PostgreSQL性能优化核心,聚焦查询执行计划的实战应用。通过EXPLAIN命令精准定位瓶颈,结合索引策略、SQL改写与参数调优,系统提升查询效率。从执行计划解读到性能调优全流程,助你掌握数据库性能诊断与优化实战能力。

2026.05.08

150

10

PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践
PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践

本文详解如何利用Next.js(搭配Drizzle ORM)与Go后端构建高性能应用,充分发挥PG在JSONB非结构化存储与pgvector向量检索上的优势。从数据建模到Docker容器化部署,打造支持AI时代的“One Database”工程化解决方案。

2026.05.08

881

10

PostgreSQL高级特性、内核机制与现代数据架构
PostgreSQL高级特性、内核机制与现代数据架构

本专题从MVCC并发控制与WAL日志等内核机制出发,详解JSONB、PostGIS及pgvector等高级特性。探讨如何利用单一引擎支撑关系型、向量及图数据等现代数据架构需求,助您掌握构建高并发、智能化应用的核心技术。

2026.05.08

244

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习