Postgresql 查看鎖的過程


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM