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 / 343252
Accepted
theMyth
theMyth
Asked: 2024-10-28 17:29:30 +0800 CST2024-10-28 17:29:30 +0800 CST 2024-10-28 17:29:30 +0800 CST

Como uma transação pode visualizar alterações não confirmadas feitas por outra transação em UNCOMMITTED READ

  • 772

Eu sei que essa provavelmente é uma pergunta boba, É a minha primeira, Parece tão fundamental que não consigo encontrar a resposta em lugar nenhum, porque deve ser tão simples que ninguém explicou. Quero entender completamente como as transações funcionam e, em particular, os níveis de isolamento e, especialmente, o nível de isolamento UNCOMMITTED READ e dirty read.

Há algumas informações contraditórias. Todos esses links abaixo são da documentação oficial:

Li muitos recursos online, alguns destes: https://learn.microsoft.com/en-us/sql/t-sql/statements/set-transaction-isolation-level-transact-sql?view=sql-server-ver16

https://medium.com/inspiredbrilliance/what-are-database-locks-1aff9117c290

https://docs.oracle.com/cd/E17277_02/html/TransactionGettingStarted/isolation.html#dirtyreads

diga algo como:

Uma leitura suja ocorre quando uma transação pode visualizar dados modificados por outra transação que ainda não foi confirmada. Mas como isso é possível e o que isso significa exatamente?

Mas isso é contraditório, se eu ver a documentação do PostgreSQL aqui: https://www.postgresql.org/docs/current/tutorial-transactions.html

Diz:

Transações são um conceito fundamental de todos os sistemas de banco de dados. O ponto essencial de uma transação é que ela agrupa várias etapas em uma única operação do tipo tudo ou nada. Os estados intermediários entre as etapas não são visíveis para outras transações simultâneas e, se ocorrer alguma falha que impeça a transação de ser concluída, nenhuma das etapas afetará o banco de dados.

E aqui:

Outra propriedade importante dos bancos de dados transacionais está intimamente relacionada à noção de atualizações atômicas: quando várias transações estão sendo executadas simultaneamente, cada uma não deve ser capaz de ver as alterações incompletas feitas por outras. Por exemplo, se uma transação estiver ocupada totalizando todos os saldos das agências, não seria bom incluir o débito da agência de Alice, mas não o crédito da agência de Bob, nem vice-versa. Portanto, as transações devem ser tudo ou nada, não apenas em termos de seu efeito permanente no banco de dados, mas também em termos de sua visibilidade à medida que acontecem. As atualizações feitas até agora por uma transação aberta são invisíveis para outras transações até que a transação seja concluída, quando todas as atualizações se tornam visíveis simultaneamente.

Eu pensei que as transações são autônomas e tudo ou nada, então como uma instrução de atualização, por exemplo, no meio de uma transação antes do commit, pode ser visível para outra? Afinal, duas ou mais transações podem até ter seus próprios threads/processos no caso do PostgreSQL, então como elas podem visualizar os dados antes do commit?

Isso significa que quando executamos instruções DML individuais dentro de uma transação, elas atualizam as linhas antes do commit e então revertem se falharem? Isso depende de como os bloqueios? Porque essa é a única maneira que eu consigo pensar que poderia funcionar

No que diz respeito às leituras sujas, uma leitura suja é o valor na linha original que foi selecionado por outra transação que pode modificá-la ou são os dados dentro de uma transação que foram atualizados, mas ainda não confirmados.

Não estou entendendo nada muito fundamental sobre isso

Por exemplo:

Considere esta tabela de exemplo básica:

CREATE TABLE TransactionEg (
    id INT GENERATED BY DEFAULT AS IDENTITY,
    name VARCHAR,
    x INT,
    y INT,
    CONSTRAINT TransactionEgPk PRIMARY KEY(id)
);

INSERT INTO transactioneg (name, x, y)
VALUES
('Row 1', 5, 11),
('Row 2', 7, 23),
('Row 3', 11, 36);

Tabela básica para mostrar exemplos de transações

Se transação 1:

BEGIN;
SELECT * FROM transactioneg T WHERE T.id = 1;
UPDATE transactioneg T SET x = x + 5 WHERE T.id = 1;
COMMIT;

Mais ou menos no mesmo momento ou logo após a instrução SELECT na 1ª transação, transação 2:

BEGIN;
SELECT * FROM transactioneg T WHERE T.id = 1;
UPDATE transactioneg T SET x = x + 10 WHERE T.id = 1;
COMMIT;

A transação 1 atualizaria o valor de x de 5 para 10. Então a transação 2 vê 10 antes do Commit? Ou ela só obtém 5, já que esse é o valor original antes do commit e o 5 se torna a leitura suja?

Qualquer conselho seria bem-vindo, embora eu ache que posso receber votos negativos por essa pergunta, espero que não.

postgresql
  • 2 2 respostas
  • 49 Views

2 respostas

  • Voted
  1. Best Answer
    Steve
    2024-10-28T19:54:46+08:002024-10-28T19:54:46+08:00

    Eu achava que as transações eram autônomas e do tipo tudo ou nada, então como uma instrução de atualização, por exemplo, no meio de uma transação antes da confirmação, pode ser visível para outra pessoa?

    Infelizmente, você está percebendo a discrepância entre os objetivos ideais de um sistema de controle de transações, que é facilitar o isolamento total de transações simultâneas umas das outras, e a realidade prática de como os mecanismos de banco de dados SQL tradicionais e o hardware de suporte são geralmente projetados para funcionar, e os recursos que os mecanismos precisam para ter um bom desempenho em uso normal, para ter um desempenho adequado em circunstâncias degradadas e para serem supervisionados adequadamente.

    O READ UNCOMMITTEDnível de isolamento é amplamente considerado como não tendo uso legítimo na operação normal de um aplicativo de banco de dados bem projetado.

    Ele é usado por dois motivos. Um é quando se lida com uma adaptação para (ou consulta ad-hoc de) um aplicativo existente cujo design existente impede o uso de níveis de isolamento mais altos por motivos de desempenho, e é considerado mais importante que a nova consulta seja executada na velocidade mais alta possível e com a menor perspectiva de interferência na progressão de outras transações, do que que os resultados da transação unisolada sejam teoricamente livres de defeitos.

    Um programador com profundo entendimento de uma aplicação específica pode ser capaz de raciocinar manualmente quais defeitos podem ocorrer nas circunstâncias e com que frequência, e aceitá-los como toleráveis ​​para o propósito. Isso pode ocorrer quando os dados informam decisões regulares que são individualmente de baixo risco e podem, às vezes, estar erradas.

    Mais frequentemente, esse modo é (mal)utilizado excessivamente por desenvolvedores incompetentes para resolver grosseiramente problemas de desempenho em aplicativos de banco de dados (normalmente problemas criados por seu próprio trabalho), que normalmente poderiam ser resolvidos de forma diferente com quantidades modestas de trabalho de design comum e competências padrão.

    Outro motivo para usar esse modo de isolamento é quando algum tipo de ação de supervisão está ocorrendo e esse supervisor deseja anular completamente o isolamento oferecido pelo gerenciador de transações (por exemplo, isso pode ser para inspecionar o progresso de outras transações simultâneas que estão sendo executadas sob garantias de isolamento mais fortes).

    Para entender tudo isso corretamente, meu conselho seria estar preparado para uma quantidade considerável de complexidade, pois todos os detalhes não se reduzem a respostas simples, e os detalhes podem diferir entre marcas de mecanismos SQL e entre diferentes modos operacionais que esses mecanismos fornecem.

    A maioria dos profissionais dessa área aceita que a situação não é boa do ponto de vista teórico ou de questões de ensino.

    • 1
  2. Laurenz Albe
    2024-10-28T22:50:59+08:002024-10-28T22:50:59+08:00

    Uma leitura suja seria ver dados não confirmados:

    -- transaction one
    START TRANSACTION;
    
    INSERT INTO tab VALUES ('something');
    
                   -- transaction two
                   SELECT * FROM tab;
    
    -- transaction one
    COMMIT;
    

    Se a transação dois vir a inserção não confirmada, isso seria uma leitura suja.

    Diferentes sistemas de gerenciamento de banco de dados implementam os níveis de isolamento do padrão SQL de forma diferente. O padrão SQL define que leituras sujas são “possíveis” no READ UNCOMMITTEDnível de isolamento, mas não diz que você tem garantia de obter leituras sujas. O PostgreSQL usa essa brecha e “atualiza” você para READ COMMITTEDquando você solicita READ UNCOMMITTED.

    Isso não é um problema, porque ninguém realmente quer ver dados sujos. Os sistemas de gerenciamento de banco de dados que permitem que você veja dados sujos fazem isso porque eles estão usando bloqueios de leitura , e você precisa READ UNCOMMITTEDevitar tomar esses bloqueios de leitura. Em essência, você está sacrificando consistência por simultaneidade. No PostgreSQL, leitores nunca bloqueiam escritores e vice-versa, para que não haja necessidade de leituras sujas.

    • 1

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