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 / 199994
Accepted
ffflabs
ffflabs
Asked: 2018-03-13 07:34:49 +0800 CST2018-03-13 07:34:49 +0800 CST 2018-03-13 07:34:49 +0800 CST

O que acontece se dois processos tentarem ATUALIZAR A VISUALIZAÇÃO MATERIALIZADA CONCORRENTEMENTE ao mesmo tempo?

  • 772

De acordo com os documentos:

CONCORRENTEMENTE Atualize a visualização materializada sem bloquear seleções simultâneas na visualização materializada. (...)

... OUTROS CONTEÚDOS ...

Mesmo com esta opção, apenas um REFRESH de cada vez pode ser executado em qualquer visualização materializada .

Eu tinha uma função que verificava o tempo da última atualização para uma MATERIALIZED VIEW e, se tivessem passado mais de 60 segundos, seria para atualizá-la.

No entanto, o que aconteceria se eu tentasse atualizar uma visão materializada de dois processos separados ao mesmo tempo? eles enfileirariam ou gerariam um erro?

Existe uma maneira de detectar quando uma MATERIALIZED VIEW está sendo atualizada e, portanto, evitar tocá-la?

Atualmente, recorri a preencher um registro de tabela antes de atualizar (definir refreshingcomo true) e, em seguida, defini-lo para falsequando o processo for concluído.

EXECUTE 'INSERT INTO refresh_status (last_update, refreshing) 
         VALUES (clock_timestamp(), true) RETURNING id') INTO refresh_id;
EXECUTE 'REFRESH MATERIALIZED VIEW CONCURRENTLY my_mat_view';
EXECUTE 'UPDATE refresh_status SET refreshing=false WHERE id=$1' USING refresh_id;

Então, sempre que chamo esse procedimento, verifico o mais recente last_updatee seu refreshingvalor. Se refreshingfor true, não tente atualizar a visualização materializada.

EXECUTE 'SELECT 
           extract(epoch FROM now() - (last_update))::integer, 
           refreshing
         FROM refresh_status
         ORDER BY last_update DESC
         LIMIT 1' INTO update_seconds_ago, refreshing;

IF(updated_seconds_ago > 60 AND refreshing = FALSE) THEN
  -- the refresh block above
END IF;

No entanto, não tenho certeza se o sinalizador de atualização está sendo atualizado de forma síncrona (quer dizer, ele realmente espera que a atualização seja realmente concluída)

Essa abordagem é racional ou estou perdendo alguma coisa aqui?

postgresql plpgsql
  • 3 3 respostas
  • 10989 Views

3 respostas

  • Voted
  1. Best Answer
    mustaccio
    2018-03-13T14:57:19+08:002018-03-13T14:57:19+08:00

    Como mencionado nesta resposta , " REFRESH MATERIALIZED VIEW CONCURRENTLYpega um EXCLUSIVEbloqueio" na mesa. Seguindo a trilha de migalhas para a documentação , podemos ler que um EXCLUSIVEbloqueio em uma tabela "permite apenas ACCESS SHAREbloqueios simultâneos, ou seja, apenas leituras da tabela podem prosseguir". No mesmo parágrafo podemos ver que " EXCLUSIVEconflita com ... EXCLUSIVE", significando que outra REFRESH MATERIALIZED VIEW CONCURRENTLYinstrução, que solicita o mesmo EXCLUSIVEbloqueio, terá que esperar até que o EXCLUSIVEbloqueio anterior seja liberado.

    Se você quiser evitar esperar por esse bloqueio por um período indefinido, você pode querer definir a variável de sessãolock_timeout para um valor sensato.

    • 16
  2. RDFozz
    2018-03-13T14:55:54+08:002018-03-13T14:55:54+08:00

    Conforme observado por mustaccio , essa questão se sobrepõe significativamente aos bloqueios de exibição materializados de atualização do Postgres .

    No entanto, embora a resposta aceita para essa pergunta tenha um link que responda a essa, a resposta a essa pergunta não está diretamente incluída nessa.

    Então, para ser específico: De acordo com a página de manual do PostgreSQL sobre bloqueio explícito (o link é para a página da versão atual, para o PostGres 10), REFRESH MATERIALIZED VIEW CONCURRENTLYleva um EXCLUSIVEbloqueio. O EXCLUSIVEbloqueio parece bloquear todos os outros bloqueios, exceto ACCESS SHARE - que inclui outros EXCLUSIVEbloqueios.

    Assim, uma segunda REFRESH MATERIALIZED VIEW CONCURRENTLYrequisição na mesma view irá aguardar a liberação do lock obtido pela primeira.

    • 4
  3. ffflabs
    2018-03-14T02:49:49+08:002018-03-14T02:49:49+08:00

    Graças às respostas de mustaccio e RDFozz , finalmente entendi que REFRESH ... CONCURRENTLYfazer um bloqueio exclusivo é o motivo pelo qual a documentação do PostgreSQL diz :

    Mesmo com esta opção, apenas um REFRESH de cada vez pode ser executado em qualquer visualização materializada .

    Eu estava com medo de que isso significasse que qualquer tentativa de fazer uma atualização simultânea geraria um erro , mas à luz de suas respostas, não há nenhum erro especial envolvido. É apenas uma questão de bloqueios que enfileirarão tentativas simultâneas. Portanto, a documentação poderia ser interpretada como:

    O bloqueio adquirido durante esta operação impedirá qualquer operação que não seja a leitura da MATERIALIZED VIEW. Outras tentativas de atualizar a Visualização Materializada enquanto um REFRESH ... CONCURRENTLY estiver em execução ficarão na fila até que o primeiro bloqueio seja liberado.

    • 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