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 / 69747
Accepted
user32234
user32234
Asked: 2014-07-05 08:09:52 +0800 CST2014-07-05 08:09:52 +0800 CST 2014-07-05 08:09:52 +0800 CST

Como configurar transações de leitura para nunca causar falha em outras transações de serialização de gravação

  • 772

Estou protegendo transações críticas com mutexes de aplicativos e arquivos SERIALIZABLE.

Presumo que isso torne essas operações o mais ácidas possível, mas agora estou preocupado que as leituras possam causar falhas nessas transações de gravação devido ao bloqueio.

As leituras estão em transações de instrução preparadas libpqxx. Eu li os documentos , wiki e white paper , mas não consigo descobrir como configurar uma transação de leitura para que ela nunca arrisque uma falha de outra transação crítica de gravação serializável.

Não consigo determinar se os bloqueios causarão falhas de serialização. Eles podem?

As leituras não precisam ser perfeitamente ácidas porque o aplicativo compensa condições de corrida, dados antigos, etc. A principal preocupação é que as transações de gravação críticas serializáveis ​​não falhem devido a outras leituras.

Como uma instrução preparada somente para leitura deve ser configurada de forma absolutamente para não arriscar outra falha de gravação de transação serializável?

postgresql rollback
  • 1 1 respostas
  • 1116 Views

1 respostas

  • Voted
  1. Best Answer
    Craig Ringer
    2014-07-07T16:17:52+08:002014-07-07T16:17:52+08:00

    Uma READ ONLYtransação não pode fazer com que uma transação de gravação (que não execute DDL) falhe, a menos que ela use explicitamente LOCK TABLEou bloqueios consultivos.

    READ ONLYas transações não podem SELECT ... FOR SHAREou SELECT ... FOR UPDATE. Como eles não podem fazer DML, o bloqueio mais forte que eles podem obter em uma tabela éACCESS SHARE , que entra em conflito apenas com o ACCESS EXCLUSIVEbloqueio obtido por DDL.

    Nem uma transação somente leitura pode causar falhas de serialização se a transação de gravação for SERIALIZABLE, porque as falhas de serialização exigem que ambas as transações executem gravações. É sempre possível serializar logicamente uma transação somente leitura antes ou depois de uma transação de leitura/gravação, pois é impossível que elas sejam mutuamente interdependentes.

    Então: Deve ser bom usar READ COMMITTEDou SERIALIZABLEtransações, com READ ONLY, contanto que você não o faça explicitamente LOCK TABLE.

    Você também precisa certificar-se de não usar bloqueios consultivos que possam interagir entre os dois conjuntos de transações. Muito provavelmente você não usa bloqueios consultivos e pode esquecer isso completamente.

    Separadamente, porém, um aplicativo deve estar preparado para lidar com falhas de serialização ou outras interrupções de transação. Qualquer projeto que tente evitar isso está quebrado. As transações podem ser abortadas devido a problemas no nível do sistema operacional/máquina host, ação do administrador, etc. Não confie em transações que "não podem falhar". Se você absolutamente deve fazer isso, você precisa usar two-phase commit , onde você PREPARE TRANSACTION(no ponto em que é garantido que o tx não pode deixar de confirmar), faz o outro trabalho que depende do tx confirmar com segurança, então COMMIT PREPARED. Se algo der errado com o outro trabalho, você pode ROLLBACK PREPARED. 2PC tem sobrecargas significativas e é melhor evitá-lo quando puder, mas às vezes simplesmente não há escolha.

    • 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