postgresql 删除过时的锁

Nil*_*ann 5 postgresql locking

系统崩溃后,我的 Postgresql 数据库确实锁定了一行。

pg_locks表包含许多没有 pid 的行。IE

select locktype,database,relation,virtualtransaction, pid,mode,granted from pg_locks p1;

locktype    | database | relation | virtualtransaction |  pid  |       mode       | granted 
---------------+----------+----------+--------------------+-------+------------------+---------
 relation      |    16408 |    31459 | -1/40059           |       | AccessShareLock  | t
 relation      |    16408 |    31459 | -1/40059           |       | RowExclusiveLock | t
 relation      |    16408 |    31022 | -1/40060           |       | AccessShareLock  | t
 transactionid |          |          | -1/40060           |       | ExclusiveLock    | t
 relation      |    16408 |    31485 | -1/40060           |       | AccessShareLock  | t
Run Code Online (Sandbox Code Playgroud)

如何杀死事务 40060 并移除锁?

Nil*_*ann 6

好吧,我自己找到的解决方案:

  1. 通过以下方式查找事务的 gid(即上例中的 40060)select * from pg_prepared_xacts where transaction = 40060;
  2. 找一个很长的 gid。
  3. ROLLBACK PREPARED gid;

这将清除锁。