查询Postgres表死锁状态的查询语句

4

我希望检查Postgres和ORACLE系统表中死锁是否已清除。

请建议我如何检查死锁状态。


你的问题毫无意义。不存在所谓的“表的死锁状态”。单个表永远不可能“有”死锁。死锁总是涉及至少两个“事务”——然后会话/事务被死锁,而不是“一个表”。 - user330315
如果您没有修改 deadlock_timeout,那么就数到一个密西西比,然后瞧 - 它就被“清除”了。 - Vao Tsun
1个回答

6
死锁不会停留,Postgres或Oracle一旦发现死锁就会中止其中一个事务。这是因为死锁本质上没有干预就无法进行。
您可以查看系统中存在的常规锁以及它们存在的时间。
长时间持有的锁可能表示运行缓慢的事务,或者代码没有在正确的位置提交等。
长期持有的锁也增加了未来发生死锁的可能性。
Postgres
您可以通过pg_locks视图完成此操作。
Postgresql wiki有一个关于查看锁的页面https://wiki.postgresql.org/wiki/Lock_Monitoring 并且pg_locks视图在https://www.postgresql.org/docs/current/static/view-pg-locks.html中有描述。
Oracle Oracle也提供了视图来显示当前的锁定,但使用起来比较复杂。

介绍可在http://www.dba-oracle.com/t_grid_rac_db_locks_latches.htm找到。

参考https://docs.oracle.com/cd/E11882_01/server.112/e40402/dynviews_2027.htm#REFRN30121

但在这两种情况下,您需要花费一些时间来确定您实际需要的内容,因为锁通常不会一次性锁定整个表,因此可能不同部分的表同时被不同事务锁定。此外,这些视图中不仅会显示表。

同样,不同类型的锁(共享锁,排它锁等)将阻止不同类型的并发活动。


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