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 / user-285899

theMyth's questions

Martin Hope
theMyth
Asked: 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

  • 5

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 respostas
  • 49 Views

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