0


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时,不仅会中断当前的查询操作,还会关闭数据库连接,释放资源。

标签: postgresql 数据库

本文转载自: https://blog.csdn.net/weixin_43492708/article/details/141401052
版权归原作者 Troye Sivan 所有, 如有侵权,请联系我们删除。

“postgresql 如何进行表有锁查询?”的评论:

还没有评论