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 / 57335
Accepted
Laird Nelson
Laird Nelson
Asked: 2014-01-23 15:19:30 +0800 CST2014-01-23 15:19:30 +0800 CST 2014-01-23 15:19:30 +0800 CST

Qual é a relação exata entre uma transação de banco de dados e o bloqueio?

  • 772

Esta é uma pergunta humilde feita no espírito de aumentar meu conhecimento; por favor, seja gentil em sua resposta.

Como desenvolvedor de aplicativos de longa data, sei em algum nível o que é uma transação (eu os uso o tempo todo). Deixando de lado os níveis de isolamento da transação no momento, em um nível alto, uma transação permite que um bloco de trabalho seja totalmente concluído ou não seja concluído e permite uma certa quantidade de isolamento de outras atividades de modificação do banco de dados.

Eu também sei o que (em vários bancos de dados) é um bloqueio, ou pelo menos como um se comporta (se eu bloquear uma tabela de alguma forma explicitamente, nenhum outro processo ou encadeamento poderá atualizar nada sobre essa tabela).

O que não estou claramente claro é: em vários bancos de dados, quando bloqueio explicitamente uma linha ou tabela, estou empregando exatamente as mesmas construções usadas pelas instalações de transação do banco de dados nos bastidores para fazer a transação funcionar corretamente?

Ou seja, me ocorre que para uma transação ser atômica e isolada, ela deve estar fazendo algum locking. Esse bloqueio iniciado por transação e oculto por transação é o mesmo tipo de bloqueio que vários bancos de dados me permitem acessar por meio de construções como ou comandos SELECT FOR UPDATEexplícitos ? LOCKOu esses dois conceitos são completamente diferentes?

Mais uma vez, peço desculpas pela ingenuidade desta pergunta; Fico feliz em ser apontado para fontes mais fundamentais.

transaction locking
  • 5 5 respostas
  • 2058 Views

5 respostas

  • Voted
  1. Best Answer
    Remus Rusanu
    2014-01-24T08:49:58+08:002014-01-24T08:49:58+08:00

    quando bloqueio explicitamente uma linha ou uma tabela, estou empregando exatamente as mesmas construções usadas pelas instalações de transação do banco de dados nos bastidores para fazer a transação funcionar corretamente?

    Sim. Se isso não fosse verdade, seu próprio 'bloqueio' seria apenas direcionado para outro 'bloqueio' semelhante e não interagiria com o próprio bloqueio do mecanismo. Portanto, você bloquearia uma linha em uma tabela para que ela não pudesse ser bloqueada por outro aplicativo da mesma maneira, mas seu bloqueio seria ignorado pelo próprio mecanismo. Essas semânticas raramente são desejadas. Na maioria das vezes, um aplicativo que bloqueia uma linha significa 'bloqueá-lo contra qualquer meio de acesso/modificar'. Observe que existem mecanismos de bloqueio que são estritamente específicos do aplicativo , porque são úteis. Por exemplo, o SQL Server possui bloqueios de aplicativos .

    me ocorre que para uma transação ser atômica e isolada, ela deve estar fazendo algum locking.

    O bloqueio é um meio de conseguir isso. A principal alternativa é o versionamento. Atualmente, a maioria dos bancos de dados oferece suporte a ambos (o que também significa que, se você 'bloquear' uma linha no aplicativo, mas outra transação usar controle de versão para ler a linha, ela será lida porque seu bloqueio não bloqueia leituras com versão).

    Você está meio que circulando em torno de um conceito conhecido no mundo da implementação de banco de dados como 'protocolo de bloqueio de duas fases' . o artigo vinculado da Wikipedia é um bom começo. Se você quiser ler uma explicação mais detalhada sobre este tópico, recomendo ir à biblioteca e pedir um empréstimo em Processamento de transações: conceitos e técnicas . Praticamente todos os bancos de dados existentes são, em sua essência, uma implementação desse livro.

    • 13
  2. Kin Shah
    2014-01-24T09:24:12+08:002014-01-24T09:24:12+08:00

    Alguns antecedentes antes de responder às suas perguntas:

    Nota: Isso está relacionado ao Microsoft SQL Server - RDBMS ........

    • Em termos muito simples, uma transação é uma sequência de trabalho que deve ser executada como uma única unidade lógica em sua totalidade e deve manter as propriedades ACID.
    • Qualquer RDBMS deve fornecer "Instalações de bloqueio" que podem ser usadas para concluir a transação em sua totalidade, preservando o isolamento da transação e sua durabilidade. Isso garante a integridade física do banco de dados.
    • Mais importante, por padrão - as transações são gerenciadas no nível da conexão. Portanto, quando uma transação é iniciada em uma conexão, todas as instruções T-SQL (S/I/U/D) executadas nessa conexão fazem parte da transação até que ela termine. ( MARS é tratado de forma diferente)

    Agora voltando as suas perguntas:

    quando bloqueio explicitamente uma linha ou uma tabela, estou empregando exatamente as mesmas construções usadas pelas instalações de transação do banco de dados nos bastidores para fazer a transação funcionar corretamente?

    Sim. Isso significa que você deve ter cuidado ao determinar a sequência de dados que serão modificados e que deixarão o banco de dados em um estado consistente. Em outras palavras, sua operação DML deve deixar o banco de dados em um estado consistente que se limita às regras de negócios de sua organização. Ainda assim, o RDBMS (aqui SQL Server) pode impor a integridade física da transação.

    De BOL: o bloqueio e o controle de versão de linha impedem que os usuários leiam dados não confirmados e impedem que vários usuários tentem alterar os mesmos dados ao mesmo tempo. Sem bloqueio ou versão de linha, as consultas executadas nesses dados podem produzir resultados inesperados, retornando dados que ainda não foram confirmados no banco de dados.

    Esse bloqueio iniciado por transação e oculto por transação é o mesmo tipo de bloqueio que vários bancos de dados me permitem acessar por meio de construções como SELECT FOR UPDATE ou comandos LOCK explícitos?

    Tudo no sql server está contido em uma transação. É quando você acessa seus dados, o RDBMS tem que fazer bloqueios dependendo do nível de isolamento e das Operações que você está realizando em seus dados. Verifique esta resposta para mais detalhes.

    Algumas boas referências:

    • Guia de controle de versão de linha e bloqueio de transação do SQL Server
    • Compreendendo os níveis de isolamento baseados em controle de versão de linha
    • Entendendo como o SQL Server executa uma consulta ==> Um dos melhores artigos de Remus Rusanu
    • Transações e Bloqueios
    • 3
  3. a1ex07
    2014-01-24T08:06:23+08:002014-01-24T08:06:23+08:00

    Eu diria que as transações fazem parte da "interface" do banco de dados, de certa forma, você, como desenvolvedor, decide quando começar, terminar, o que fazer dentro do escopo das transações, etc. Os bloqueios, a meu ver, pertencem aos detalhes da implementação e usado para sincronização de acesso a diferentes objetos. Na maioria dos casos, o próprio motor decide o que e por quanto tempo deve ser travado. Existem muitos bloqueios no nível do sistema que não podem ser manipulados diretamente (por exemplo, o mecanismo pode bloquear certas áreas da memória). Mesmo quando se trata de bloqueios DML, muitos deles acontecem nos bastidores (por exemplo, para garantir a integridade referencial do Oracle e, pelo que me lembro, o SQLServer pode colocar um bloqueio em uma linha correspondente na tabela mestre se um novo registro for inserido em tabela de detalhes) como resultado de instruções DML emitidas na transação.

    Quando se trata de transações, você pode esperar um comportamento mais ou menos consistente de qualquer RDMS que afirme estar em conformidade com SQL e dar suporte a transações, mas quando se trata de bloqueios, quase todos os fornecedores usam estratégias e terminologias diferentes. A parte comum em todos os RMDS, até onde posso dizer, é que a simultaneidade entre as transações é definida pelo nível de isolamento, enquanto a simultaneidade entre os bloqueios é controlada pelos tipos de bloqueio (compartilhado, exclusivo etc.).

    Para resumir, os bloqueios são mecanismos de baixo nível para controlar a consistência de objetos e simultaneidade. Bloqueios podem ser emitidos durante a execução de instruções SQL. Dependendo da implementação do nível de isolamento da transação, o mecanismo pode colocar diferentes tipos de bloqueios nos objetos afetados (linhas, grupo de linhas, índices, etc). Há um número limitado de comandos disponíveis para emitir bloqueios manualmente ( SELECT FOR UPDATE, LOCK). Os bloqueios DML podem ser escalados (depende do RDMS, por exemplo, em SQLServer row->page->partition->table ). Os bloqueios também podem ser emitidos pelo mecanismo de banco de dados durante o início da conexão, backups, restauração, recompilação de procedimento/trigger/função/etc, inicialização, desligamentos, etc.

    Não tenho certeza se isso responde a sua pergunta, mas espero que faça sentido.

    • 2
  4. Matan Yungman
    2014-01-23T22:08:03+08:002014-01-23T22:08:03+08:00

    Usarei o jargão do SQL Server, mas os conceitos devem ser os mesmos para outros fornecedores:

    Cada comando que você executa é executado dentro de uma transação. Essa transação pode ser aberta explicitamente com BEGIN TRAN, ou implicitamente, pelo mecanismo de banco de dados. A razão pela qual uma transação implícita é aberta é que o mecanismo ainda precisa manter a conformidade com ACID e a capacidade de reversão.

    Quando você faz um SELECT FOR UPDATE, significa apenas que, enquanto a transação estiver em vigor, ela manterá um determinado bloqueio.

    • 1
  5. Up_One
    2014-01-24T08:10:05+08:002014-01-24T08:10:05+08:00

    Lock são necessários e eles fazem o banco de dados. Isso evita que os dados sejam corrompidos ou invalidados quando vários usuários tentam ler enquanto outros gravam no banco de dados. O isolamento transacional geralmente é implementado bloqueando tudo o que é acessado em uma transação. Aplicativos de design ruim fazem um grande uso do conceito de bloqueio de banco de dados :) !! Portanto, para evitar o bloqueio, concentre-se no seu FK e no layout de dados.

    É tudo sobre ACID: - leia isto e isso irá clarear sua mente! ACID é um conjunto de propriedades que você gostaria de aplicar ao modificar um banco de dados.

    • **Atomicidade
    • Consistência
    • Isolamento
    • Durabilidade**

    Uma transação é um conjunto de alterações relacionadas que é usado para obter algumas das propriedades ACID. As transações são ferramentas para alcançar as propriedades ACID.

    Atomicidade significa que você pode garantir que toda uma transação aconteça, ou nenhuma; você pode fazer operações complexas como uma única unidade, tudo ou nada, e uma falha, falha de energia, erro ou qualquer outra coisa não permitirá que você fique em um estado em que apenas algumas das alterações relacionadas tenham ocorrido.

    Consistência significa que você garante que seus dados serão consistentes; nenhuma das restrições que você tem sobre dados relacionados será violada.

    Isolamento significa que uma transação não pode ler dados de outra transação que ainda não foi concluída. Se duas transações estiverem sendo executadas simultaneamente, cada uma verá o mundo como se estivessem executando sequencialmente, e se uma precisar ler dados que são escritos por outra, terá que esperar até que a outra termine.

    Durabilidade significa que, uma vez concluída a transação, é garantido que todas as alterações foram registradas em uma mídia durável (como um disco rígido) e o fato de que a transação foi concluída também é registrado.

    Assim, as transações são um mecanismo para garantir essas propriedades; são uma forma de agrupar ações relacionadas de modo que, como um todo, um grupo de operações possa ser atômico, produzir resultados consistentes, ser isolado de outras operações e ser registrado de forma duradoura.

    • 0

relate perguntas

  • Como descobrir quem excluiu alguns dados SQL Server

  • É possível escrever uma consulta SQL que automaticamente reconcilie/"transacione" pagamentos e cobranças

  • Diferença entre Flashback Query e Modo de Transação Serializável?

  • Justifique NÃO usando a dica (nolock) em todas as consultas

  • Qual é o termo correto para descrever uma "transação persistente"?

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