PostgreSQL 清除过期锁定

6

系统崩溃后,我的Postgresql数据库在一行上有一个锁定。

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

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

我如何结束事务40060并解除锁定?


好的,我找到了问题的解决方案: - Nils Bokermann
1个回答

6

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

  1. 通过 select * from pg_prepared_xacts where transaction = 40060; 找到事务的 gid(即上述示例中的 40060);
  2. 找到一个可怕的长 gid;
  3. ROLLBACK PREPARED gid;

这将清除锁定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接