Postgre SQL pgsql解决表死锁解锁
问题描述
对表进行范围更新,导致表锁死,业务系统瘫痪
解决办法
--查询是否锁表了
select oid from pg_class where relname='可能锁表了的表'
--pid 是进程
select pid from pg_locks where relation='上面查出的oid'
--如果查询到了结果,表示该表被锁 则需要释放锁定
select pg_cancel_backend(上面查到的pid)
--批量杀死pid进程,把执行结果复制下来,一起执行即可
select 'select pg_cancel_backend( '''|| 填pid ||''');' pid from pg_locks where relation='填oid'
大招
如果以上方法进程杀不掉,用以下命令可解决
select pg_terminate_backend([pid]);
函数区别
pg_cancel_backend()
只能关闭当前用户下的后台进程,向后台发送SIGINT信号,用于关闭事务,此时session还在,并且事务回滚.
pg_terminate_backend()
需要superuser权限,可以关闭所有的后台进程,向后台发送SIGTERM信号,用于关闭事务,此时session也会被关闭,并且事务回滚
注意
pg_terminate_backend()会把session也关闭,此时sessionId会失效,可能会导致系统账号退出登录,需要清除掉浏览器的缓存cookie
参考
https://www.cnblogs.com/yulinlewis/p/11863750.html