PostgreSQL锁表

关于数据库锁表问题。

修复方法

pg_cancel_backend用来取消一个进程
首先通过pg_stat_activity查出你要取消的进程号
select procpid from pg_stat_activity where ......;
然后,用这个函数来取消:
select pg_cancel_backend(procpid);
这个函数主要是取消某个进程,但是某个会话并不会因此而被强制退出

1
2
select pid,query from pg_stat_activity where wait_event_type='Lock';
select pg_cancel_backend(procpid);

锁表原因及解决思路

  1. 锁表发生在insert update 、delete 中
  2. 锁表的原理是数据库使用独占式封锁机制,当执行上面的语句时,对表进行锁住,直到发生commite或者回滚或者退出数据库用户
  3. 锁表的原因
    • A程序执行了对 tableA 的 insert ,并还未 commite时,B程序也对tableA 进行insert 则此时会发生资源正忙的异常 就是锁表
    • 锁表常发生于并发而不是并行(并行时,一个线程操作数据库时,另一个线程是不能操作数据库的,cpu 和i/o 分配原则)
  4. 减少锁表的概率,
    • 减少insert 、update 、delete 语句执行 到 commite 之间的时间。具体点批量执行改为单个执行、优化sql自身的非执行速度
    • 如果异常对事物进行回滚

如果文章对您有帮助,感谢您的赞助支持!