今天遇到一个奇怪的现象,select和delete表时正常执行,但truncate和drop表时会一直运行,也不报错。sql
查了些资料才发现问题的缘由,总结以下:数据库
"drop table " 和 "truncate table " 须要申请排它锁 "ACCESS EXCLUSIVE ", 执行这个命令卡住时,说明此时这张表上还有操做正在进行,好比查询等,
那么只有等待这个查询操做完成,"drop table" 或"truncate table"或者增长字段的SQL 才能获取这张表上的 "ACCESS EXCLUSIVE" 锁 ,操做才能进行下去。
函数
1.检索出死锁进程的ID。spa
SELECT * FROM pg_stat_activity WHERE datname='死锁的数据库ID ';对象
检索出来的字段中,【wating 】字段,数据为t的那条,就是死锁的进程。找到对应的【procpid 】列的值。进程
2.将进程杀掉。it
SELECT pg_cancel_backend('死锁那条数据的procpid值 ');io
结果:运行完后,再次更新这个表,sql顺利执行。table
若是pg_stat_activity 没有记录,则查询pg_locks是否有这个对象的锁class
select oid,relname from pg_class where relname='table name';
select locktype,pid,relation,mode,granted,* from pg_locks where relation= '上面查询出来的oid';
select pg_cancel_backend('进程ID');
另外pg_terminate_backend()函数也能够杀掉进程。