问题
在业务执行过程中,可能因为并发多表操作,引起资源抢占导致数据表被死锁,引起整个系统奔溃。
解决方案
1.检测死锁
--查询指定表的oid
select oid from pg_class where relname='t_mytab'; -- t_mytab为你觉得可能死锁的表名
-- 根据oid查询该表正在被执行的进程 pid
select pid from pg_locks where relation='358009'; -- 358009为上述查询到表t_mytab的oid
2.解除死锁
--如果上面检测查询到了pid结果,则说明该表可能被锁,需要执行释放锁定指令。
select pg_cancel_backend('8954'); -- 8954为pid
3.批量解除
若查询到的Pid记录很多,则你可能需要批量执行。以下语句可以生产批量语句,复制出来执行执行即可。
-- 以下358009为步骤1中查询到的死锁表的oid
select 'select pg_cancel_backend( '''|| pid ||''');' pid from pg_locks where relation='358009'