postgresql删除过时的锁

时间:2017-02-09 10:19:42

标签: postgresql locking

系统崩溃后,我的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杀死并删除锁?

1 个答案:

答案 0 :(得分:3)

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

  1. 通过select * from pg_prepared_xacts where transaction = 40060;
  2. 找到交易的gid(即上述案例中的40060)
  3. 找一个可怕的长gid。
  4. ROLLBACK PREPARED gid;
  5. 这将清除锁。