最近公司做項目,遇到一個問題: 查詢DB(PostgresSQL) 某張表速度異常的慢(甚至是打不開),考慮了很久,以為是DB 問題, 但是其他表正常, 后來想Drop 掉該表,發現刪也刪不掉。
1 SELECT * FROM pg_stat_activity where datname='DB名稱' and usename='用戶名稱' order by query_start desc
1 -- 查詢該表名是否被鎖,有查詢結果則證明該表被鎖 2 select oic from pg_class where relname='DB表名' 3 4 -- 根據以上SQL查詢出的OIC 可以查出被鎖表的所有被鎖進程 5 select pid from pg_locks where relation='4106774'
通過以上指令呢 可以查詢出當前DB 中所有的進程,可以觀察到 其中一個欄位叫 wait_event_type 我發現在我的查詢中出現了很多次 Lock , 意思就是說: 我的DB 在執行某個任務時 誤將我的 該表造成了死鎖,所以要想解決這問題呢! 就是必須將死鎖的進程殺掉或者想辦法釋放死鎖、
--根據進程PID 可以殺掉進程、此方法只對select 造成的死鎖有效 select pg_cancel_backend(進程PID) --根據線程PID 可以殺掉各種進程 select pg_terminate_backend(pid int)
將所有造成Lock 的進程釋放完之后 表的查詢恢復正常
總結: 數據表如果有一條死鎖,如果不得已釋放, 后邊的所有查詢都會被阻塞,所以在設計程序時,要避免此事件的發生, 在發生死鎖的時候,要第一時間將 死鎖進程關閉