postgresql 如何进行表有锁查询?

一、有锁阻塞查询
当我们想要对某一数据表table进行操作(update、delete、insert)时,发现事务一直等待。
此时,我们可以通过如下命令进行数据库中有锁的活跃进程进行查询:

select * from pg_catalog.pg_stat_activity
where pid in(select pid 
from pg_catalog.pg_locks pl 
--where relation::regclass::varchar ='table_schema.table_name' //对特定的表进行有锁活跃度查询')

pg_locks 展示锁信息,每一个被锁或者等待锁的对象一条记录。
pg_stat_activity 每个会话一条记录,显示会话状态信息。
首先通过表pg_locks查询阻塞表进程pid

SELECT database, locktype, relation, relation::regclass, mode, pid FROM pg_locks where granted=true;
//granted=true是阻塞别人的,false是被阻塞的

然后根据pid和relation通过找到阻塞源。并通过表pg_stat_activity查询阻塞源相关query信息和阻塞状态:

select pid,usename,wait_event,state from pg_stat_activity where pid=xxx;

state为idle in transaction说明该会话执行完了但没有提交

二、解决方法

select pg_canel_backend(pid);

‌ pg_cancel_backend‌:这个函数主要用于取消当前某个进程的查询操作,但它不能释放数据库连接。这意味着,虽然它可以中断正在执行的查询,但它不会关闭数据库连接,因此连接仍然保持活动状态。

 select pg_terminate_backend‌(pid);

pg_terminate_backend‌:这个函数更为激进,它可以在PostgreSQL的后台杀死进程,从而释放出宝贵的连接资源。这意味着,当使用pg_terminate_backend时,不仅会中断当前的查询操作,还会关闭数据库连接,释放资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值