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 UPDATE
explícitos ? LOCK
Ou 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.
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 .
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.
Alguns antecedentes antes de responder às suas perguntas:
Nota: Isso está relacionado ao Microsoft SQL Server - RDBMS ........
Agora voltando as suas perguntas:
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.
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:
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.
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.
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.
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.