pgsql查看事務相關情況

2025-02-25

1. 查询表的锁和事务信息

PostgreSQL 提供了 pg_locks 系统视图,可以查看当前数据库中所有锁的状态,包括哪些事务正在锁定某个表或行。可以通过以下 SQL 查询某个表相关的锁信息:

SELECT 
    pid, 
    mode, 
    granted, 
    transactionid
FROM 
    pg_locks l
JOIN 
    pg_class c ON l.relation = c.oid
WHERE 
    c.relname = 'table_name';
  • pid: 持有锁的进程 ID。

  • mode: 锁的模式(例如 AccessShareLock、RowExclusiveLock 等)。

  • granted: 是否已经授予锁。

  • transactionid: 如果锁与事务相关联,则会显示事务 ID。

2. 查询活动事务

PostgreSQL 提供了 pg_stat_activity 视图,可以查看当前数据库中的所有活动事务。结合表名,可以进一步筛选出涉及某个表的事务:

SELECT 
    datname, 
    pid, 
    query, 
    state, 
    backend_start, 
    query_start
FROM 
    pg_stat_activity
WHERE 
    query LIKE '%table_name%';
  • datname: 数据库名称。

  • pid: 进程 ID。

  • query: 当前执行的 SQL 语句。

  • state: 事务状态(active、idle 等)。

  • backend_start: 后端启动时间。

  • query_start: 查询开始时间。

3. 查询表的访问统计

PostgreSQL 提供了 pg_stat_user_tables 视图,可以查看每个表的访问统计信息,包括读写次数等。

SELECT 
    relname, 
    seq_scan, 
    idx_scan, 
    n_tup_ins, 
    n_tup_upd, 
    n_tup_del, 
    n_live_tup, 
    n_dead_tup
FROM 
    pg_stat_user_tables
WHERE 
    relname = 'table_name';
  • seq_scan: 表的顺序扫描次数。

  • idx_scan: 表的索引扫描次数。

  • n_tup_ins: 插入的元组数。

  • n_tup_upd: 更新的元组数。

  • n_tup_del: 删除的元组数。

  • n_live_tup: 当前存活的元组数。

  • n_dead_tup: 当前死亡的元组数。

4. 查询未提交事务

如果想查看当前未提交的事务,可以结合 pg_stat_activitypg_locks

SELECT 
    a.pid, 
    a.query, 
    l.mode, 
    l.granted
FROM 
    pg_stat_activity a
JOIN 
    pg_locks l ON a.pid = l.pid
JOIN 
    pg_class c ON l.relation = c.oid
WHERE 
    c.relname = 'your_table_name'
    AND a.state = 'active';