A visão pg_locks fornece acesso a informações sobre bloqueios dentro do servidor de banco de dados mantidos por transações em aberto. Veja no Capítulo 12 mais explicações sobre bloqueio.
pg_locks contém uma linha por objeto bloqueável ativo, modo de bloqueio requisitado e transação relevante. Assim, o mesmo objeto bloqueável pode aparecer várias vezes, se várias transações estiverem mantendo ou aguardando por bloqueios no mesmo. Entretanto, um objeto que atualmente não possui nenhum bloqueio atuando sobre o mesmo não aparece. Um objeto bloqueável é uma relação (por exemplo, uma tabela), ou um ID de transação.
Deve ser observado que esta visão inclui apenas bloqueios no nível de tabela, e não no nível de linha. Se a transação estiver aguardando por um bloqueio no nível de linha, é mostrada na visão como aguardando pelo ID da transação que está atualmente mantendo o bloqueio na linha.
Tabela 42-33. Colunas de pg_locks
Nome | Tipo | Referencia | Descrição |
---|---|---|---|
relation | oid | pg_class.oid | OID da relação bloqueada, ou NULL se o objeto bloqueável for um ID de transação. |
database | oid | pg_database.oid | OID do banco de dados em que a relação bloqueada se encontra, ou zero se a relação bloqueada for uma tabela compartilhada globalmente, ou NULL se o objeto bloqueável for um ID de transação. |
transaction | xid | ID da transação, ou NULL se o objeto bloqueável for uma relação. | |
pid | integer | ID de processo do processo servidor mantendo ou aguardando pelo bloqueio | |
mode | text | Nome do modo de bloqueio mantido ou desejado por este processo (consulte a Seção 12.3.1) | |
granted | boolean | Verdade se o bloqueio está sendo mantido, falso se o bloqueio está sendo aguardado |
granted é verdade em uma linha representando um bloqueio mantido pela sessão indicada. Falso indica que esta sessão está atualmente aguardando para obter o bloqueio, o que implica que alguma outra sessão está mantendo um modo de bloqueio conflitante no mesmo objeto bloqueável. A sessão aguardando dorme até que o bloqueio seja liberado( ou até que uma situação de impasse seja detectada). Uma única sessão pode estar aguardando para obter no máximo um único bloqueio por vez.
Cada transação mantém um bloqueio exclusivo em seu ID de transação por toda a sua duração. Se uma transação descobrir que é necessário aguardar especificamente por outra transação, ela fará isto tentando obter um bloqueio compartilhado no ID da outra transação. Somente será bem-sucedido quando a outra transação terminar e liberar seus bloqueios.
Quando a visão pg_locks é acessada, as estruturas de dado internas do gerenciador de bloqueios são momentaneamente bloqueadas, e é feita uma cópia para ser mostrada pela visão. Isto garante que a visão produz um conjunto de resultados consistente, enquanto que não bloqueia as operações normais do gerenciador de bloqueios por mais tempo que o necessário. Apesar disso, pode haver algum impacto no desempenho do banco de dados se esta visão for consultada freqüentemente.
pg_locks provê uma visão global de todos os bloqueios no agrupamento de bancos de dados, e não apenas aqueles relevantes para o banco de dados corrente. Embora possa ser feita uma junção de sua coluna relation com pg_class.oid para identificar as relações bloqueadas, isto só funciona de forma correta para as relações no banco de dados corrente (aqueles em que a coluna database é o OID do banco de dados corrente ou zero).
Se o coletor de estatísticas estiver ativado, pode ser feita a junção da coluna pid com a coluna procpid da visão pg_stat_activity para obter mais informações sobre a sessão mantendo ou aguardando para obter o bloqueio.