Postgresql 死锁解决方案

@lucas  June 27, 2023

- 死锁产生的原因

数据库死锁的情况是什么?当多个事务处理对多个资源同时访问时,若双方已锁定一部分资源但也都需要对方已锁定的资源时,无法在有限的时间内完全获得所需的资源,就会处于无限的等待状态,从而造成其对资源需求的死锁,导致锁表。

以下情况将导致死锁的发生:
在某一个时刻,线程A更新 user表的第1行数据,线程B更新 user表的第2行数据;在下一刻,线程A需要操作user表的第2行数据(获取行锁),线程B需要操作user表的第1行数据,此时两个线程都无法获取锁,形成死锁。

  • 拼接查询死锁的pid语句

    select 'select pg_cancel_backend('||pid||');' pid from pg_stat_activity where datname= '' and wait_event_type = 'Lock';
  • 取消执行

    select pg_cancel_backend(pid);
  • 终止执行

    select pg_terminate_backend(pid);

添加新评论