一、查看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