一、查看sql语句是否发生死锁
1.查看数据库的进程。SELECT * FROM pg_stat_activity WHERE datname='死锁的数据库ID ';
检索出来的字段中,【wating 】字段,数据为t的那条,就是死锁的进程,找到对应的【procpid 】列的值。
例如:SELECT procpid FROM pg_stat_activity WHERE datname='数据库ID' and waiting ='t';
2.杀掉进程。
kill有两种方式,第一种是:
SELECT pg_cancel_backend(PID);
这种方式只能kill select查询,对update、delete 及DML不生效)
第二种是:
SELECT pg_terminate_backend(PID);
这种可以kill掉各种操作(select、update、delete、drop等)操作
具体查询语句:
--查询阻塞的sql( 死锁了,没有执行通过的sql ) select * from pg_stat_activity aa, ( select a.locktype,a.database,a.pid,a.mode,a.relation,b.relname from pg_locks a join pg_class b on a.relation=b.oid where upper(b.relname)='xxx' ) bb where aa.pid=bb.pid and aa.waiting='t' --释放 死锁的sql select pg_cancel_backend(上面查询到的pid) --查询是否锁表了 select oid from pg_class where relname='可能锁表了的表' --oid是每个表隐藏的id select pid from pg_locks where relation='上面查出的oid' --如果查询到了结果 则释放锁定 select pg_cancel_backend(上面查到的pid)
测试PostgreSQL行级锁
Reference:
[1] https://blog.csdn.net/liuxiumeitanjie/article/details/38816871
[2] https://blog.csdn.net/czp11210/article/details/51320700
[3] https://blog.csdn.net/liyazhen2011/article/details/83379225