pgsql:检查数据表的死锁和解除死锁的方法

问题

在业务执行过程中,可能因为并发多表操作,引起资源抢占导致数据表被死锁,引起整个系统奔溃。

解决方案

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'

你可能感兴趣的:(PostgreSQL,数据库)