AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 217523
Accepted
Anentropic
Anentropic
Asked: 2018-09-14 07:17:43 +0800 CST2018-09-14 07:17:43 +0800 CST 2018-09-14 07:17:43 +0800 CST

Entendendo o postgres txid_current e pg_locks

  • 772

Estou tentando obter uma lista de pg_locksrelevantes para a transação atual

por exemplo

> BEGIN;
BEGIN
> ALTER TABLE ... ;
ALTER TABLE
> select locktype,virtualxid,transactionid,mode,relation from pg_locks;
  locktype  | virtualxid | transactionid |        mode         | relation
------------+------------+---------------+---------------------+----------
 relation   | [NULL]     |        [NULL] | AccessShareLock     |    11695
 virtualxid | 2/24699    |        [NULL] | ExclusiveLock       |   [NULL]
 relation   | [NULL]     |        [NULL] | AccessExclusiveLock |   801091
(3 rows)

Ok, então o que eu considero como "minha" fechadura aqui é a última, aAccessExclusiveLock

Mas não tem transactionidou virtualxid.

Se houver outra atividade no banco de dados, verei outros bloqueios também nesta lista.

Como faço para filtrar apenas os bloqueios pertencentes à minha transação atual, se eles tiverem IDs de transação nulos?

postgresql
  • 3 3 respostas
  • 1287 Views

3 respostas

  • Voted
  1. Best Answer
    Anentropic
    2018-09-15T02:50:43+08:002018-09-15T02:50:43+08:00

    Eu encontrei uma resposta.

    Havia duas partes para isso.

    Em primeiro lugar, o que é importante é virtualtransactionem vez de virtualxid. Mesmo sendo virtualxidnulos transactionidpara tudo o que me interessa, todos eles compartilham um virtualtransactionid.

    Em segundo lugar, embora txid_current()retorne a transactionid, o que parece não ajudar porque todos os meus bloqueios têm null para isso, ainda podemos usá-lo para obter o que queremos.

    O que acontece é que quando você chama txid_current()postgres atribui um lock com o transactionidretornado por aquela função, que podemos ver se consultarmos pg_locks. Esse bloqueio compartilhará um virtualtransactionid com todo o resto da transação atual.

    Por exemplo:

    > BEGIN;
    BEGIN
    > SELECT locktype,transactionid,virtualtransaction,mode FROM pg_locks;
      locktype  | transactionid | virtualtransaction |      mode
    ------------+---------------+--------------------+-----------------
     relation   |        [NULL] | 3/38672            | AccessShareLock
     virtualxid |        [NULL] | 3/38672            | ExclusiveLock
    (2 rows)
    
    > SELECT txid_current();
     txid_current
    --------------
           355056
    (1 row)
    
    > SELECT locktype,transactionid,virtualtransaction,mode FROM pg_locks;
       locktype    | transactionid | virtualtransaction |      mode
    ---------------+---------------+--------------------+-----------------
     relation      |        [NULL] | 3/38672            | AccessShareLock
     virtualxid    |        [NULL] | 3/38672            | ExclusiveLock
     transactionid |        355056 | 3/38672            | ExclusiveLock
    (3 rows)
    

    Então agora a partir disso podemos obter o virtualtransactionid compartilhado por tudo na transação atual e filtrar isso.

    Em outras palavras:

    SELECT
        *
    FROM pg_locks pl
    WHERE
        virtualtransaction=(
            SELECT virtualtransaction FROM pg_locks
                WHERE
                    transactionid::text = (txid_current() % (2^32)::bigint)::text
                    -- compare int to xid, see https://dba.stackexchange.com/a/123183/10371 
                    AND locktype='transactionid'
            LIMIT 1
        )
    

    ... retornará apenas bloqueios relevantes para a transação atual.

    • 1
  2. user2636164
    2020-09-01T00:28:52+08:002020-09-01T00:28:52+08:00

    Que tal agora:

    pgb=# begin;
    BEGIN
    pgb=# select * from pg_locks where pid=pg_backend_pid();
      locktype  | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction |  pid   |      mode       | granted | fastp
    ath
    ------------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+--------+-----------------+---------+------
    ----
     relation   |    33154 |    12143 |      |       |            |               |         |       |          | 6/20625            | 167525 | AccessShareLock | t       | t
     virtualxid |          |          |      |       | 6/20625    |               |         |       |          | 6/20625            | 167525 | ExclusiveLock   | t       | t
    (2 rows)
    
    pgb=# insert into test values(4);
    INSERT 0 1
    pgb=# select * from pg_locks where pid=pg_backend_pid();
       locktype    | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction |  pid   |       mode       | granted | f
    astpath
    ---------------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+--------+------------------+---------+--
    --------
     relation      |    33154 |    33212 |      |       |            |               |         |       |          | 6/20625            | 167525 | RowExclusiveLock | t       | t
     relation      |    33154 |    12143 |      |       |            |               |         |       |          | 6/20625            | 167525 | AccessShareLock  | t       | t
     virtualxid    |          |          |      |       | 6/20625    |               |         |       |          | 6/20625            | 167525 | ExclusiveLock    | t       | t
     transactionid |          |          |      |       |            |        592429 |         |       |          | 6/20625            | 167525 | ExclusiveLock    | t       | f
    (4 rows)
    
    • 1
  3. Victor Di Leo
    2018-09-14T12:12:13+08:002018-09-14T12:12:13+08:00

    Veja se isso ajuda:

    select l.relation::regclass, l.relation, l.locktype, l.database, l.classid, l.objid, l.objsubid, l.pid, l.mode, l.granted, l.fastpath 
    from pg_locks l
    where granted = false ;
    

    Ele exibirá o nome da tabela e onde concedido = false mostra onde o acesso não foi concedido (ou seja, existe um bloqueio).

    Além disso, você pode obter seu PID atual no BASH:

    $ (echo $$; echo $BASHPID)

    obter pid no shell (bash)

    Algumas consultas úteis aqui para monitorar bloqueios: Monitoramento de bloqueio

    • 0

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve