马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
一、有锁阻塞查询
当我们想要对某一数据表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企服之家,中国第一个企服评测及商务社交产业平台。 |