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 / 337390
Accepted
Philipp Faster
Philipp Faster
Asked: 2024-03-01 17:44:52 +0800 CST2024-03-01 17:44:52 +0800 CST 2024-03-01 17:44:52 +0800 CST

Quais são as desvantagens de usar locktable?

  • 772

Tenho muitos lugares em meu aplicativo onde os usuários estão fazendo algo que não deveria ser simultâneo em bases por usuário e namespace. Então isso significa que:

  • Dois usuários podem pressionar o mesmo botão ao mesmo tempo
  • Um usuário não pode pressionar o mesmo botão uma segunda vez até que o primeiro toque seja concluído
  • Um usuário pode pressionar botões diferentes ao mesmo tempo

Quais soluções eu tentei:

  1. Bloqueio consultivo com função hash no usuário uuid - tem colisões e esse bloqueio consultivo, mas o bloqueio bloqueia todas as interações do usuário - então ele não pode pressionar dois botões ao mesmo tempo
  2. INSERT& SELECT FOR UPDATE- bom, mas preciso preencher previamente a tabela com linha "pendente" para poluir o esquema da tabela com colunas desnecessárias.
  3. Deseja implementar: locktable. Então, o que quero dizer é criar uma tabela com bloqueios do tipo consultivo. Terá duas colunas namespacee id- chave primária composta. Cada vez que o usuário pressionar o botão nº 1, haverá INSERT& FOR UPDATEpara namespace= button#1e id= {userid}.

Eu sinto que existem algumas pedras escondidas nesta (3ª) abordagem - alguém sabe disso? Você poderia gentilmente listar esses problemas?

Tenho certeza de que será pior em termos de desempenho do que os bloqueios de aconselhamento, mas será muito pior? Além disso, não consegui encontrar implementações dessa abordagem - parece que tive uma ideia estúpida que ninguém usa por algum motivo importante.

Confira esta conversa interessante em 2009 sobre este problema: https://www.postgresql.org/message-id/ [email protegido]

Por INSERT& FOR UPDATEquero dizer:

INSERT INTO adv_locks VALUES ('btn1', '123') ON CONFLICT ON CONSTRAINT adv_locks_pk DO NOTHING;
SELECT 1 FROM adv_locks WHERE namespace='btn1' and id='123' FOR UPDATE;

Dessa forma sempre haverá uma linha em uma tabela com esta tabela que pode ser bloqueada. (Ainda não me importo muito com o tamanho da mesa)

Entendo que uma ordem dessa pode ser quebrada (quero dizer, a solicitação nº 1 cria uma linha e a solicitação nº 2 seleciona a linha mais rapidamente), mas não é um problema para mim.

postgresql
  • 1 1 respostas
  • 39 Views

1 respostas

  • Voted
  1. Best Answer
    Laurenz Albe
    2024-03-04T11:48:52+08:002024-03-04T11:48:52+08:00

    A ideia de sincronizar threads de aplicativos por meio de bloqueios de linha regulares em uma tabela especial é ruim. A razão é que você precisa manter uma transação de banco de dados aberta pelo tempo que quiser manter o bloqueio, o que pode demorar bastante, visto que estamos falando de interações do usuário. Transações de longa execução são ruins, pois impedem o progresso do importante trabalho de limpeza do VACUUM, e você acabará com tabelas inchadas e talvez problemas de encapsulamento de ID de transação.

    Se você usar bloqueios consultivos, que não exigem que você mantenha uma transação aberta, sua tabela de bloqueios poderá evitar esse problema. Mas os bloqueios de aconselhamento estão vinculados a sessões de banco de dados, e um thread de aplicativo precisaria manter uma sessão de banco de dados enquanto espera que o usuário termine de pressionar o botão. Isso causará um problema com o pool de conexões, e você desejará ter um pool de conexões no modo de transação se quiser que seu aplicativo tenha um bom desempenho.

    Você pode pensar que minhas preocupações são ridículas se o intervalo de tempo para a fechadura for tão curto quanto o apertar de um botão. É verdade que normalmente isso pode levar pouco tempo, mas você deve imaginar problemas como uma falha do aplicativo ou um problema de rede entre o pressionamento e a liberação de um botão.

    Eu escolheria uma solução que insere ou atualiza uma linha em uma tabela sempre que um botão é pressionado e liberado. Se você usar um carimbo de data/hora, também poderá usá-lo para expirar um "bloqueio". se você usar atualizações HOT , isso pode funcionar bem.

    • 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