postgresql 如何举行表有锁查询?

打印 上一主题 下一主题

主题 1007|帖子 1007|积分 3021

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、有锁阻塞查询
当我们想要对某一数据表table举行操作(update、delete、insert)时,发现变乱一直等待。
此时,我们可以通过如下命令举行数据库中有锁的活泼进程举行查询:
  1. select * from pg_catalog.pg_stat_activity
  2. where pid in(select pid
  3. from pg_catalog.pg_locks pl
  4. --where relation::regclass::varchar ='table_schema.table_name' //对特定的表进行有锁活跃度查询')
复制代码
pg_locks 展示锁信息,每一个被锁大概等待锁的对象一条记录。
pg_stat_activity 每个会话一条记录,显示会话状态信息。
首先通过表pg_locks查询阻塞表进程pid
  1. SELECT database, locktype, relation, relation::regclass, mode, pid FROM pg_locks where granted=true;
  2. //granted=true是阻塞别人的,false是被阻塞的
复制代码
然后根据pid和relation通过找到阻塞源。并通过表pg_stat_activity查询阻塞源相关query信息和阻塞状态:
  1. select pid,usename,wait_event,state from pg_stat_activity where pid=xxx;
复制代码
state为idle in transaction说明该会话实验完了但没有提交
二、解决方法
  1. select pg_canel_backend(pid);
复制代码
‌ pg_cancel_backend‌:这个函数重要用于取消当前某个进程的查询操作,但它不能释放数据库连接。这意味着,虽然它可以中断正在实验的查询,但它不会关闭数据库连接,因此连接仍然保持活动状态。
  1. select pg_terminate_backend‌(pid);
复制代码
pg_terminate_backend‌:这个函数更为激进,它可以在PostgreSQL的后台杀死进程,从而释放出宝贵的连接资源。这意味着,当使用pg_terminate_backend时,不但会中断当前的查询操作,还会关闭数据库连接,释放资源。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表