飞不高 发表于 2024-11-12 16:29:35

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: postgresql 如何举行表有锁查询?