O SQL Server normalmente usa uma estratégia de bloqueio diferente da Oracle. A estratégia padrão usada pelo SQL Server significa que a seleção de linhas faz com que bloqueios de leitura (em linhas, páginas ou na tabela inteira) sejam colocados nelas*. Portanto, às NOLOCKvezes é uma cláusula útil - embora o conselho geral seja nunca usá-la, pois altera a semântica dos níveis de isolamento e pode causar resultados inconsistentes na saída das consultas.
* (Observação: esse é o padrão. Se o SNAPSHOTisolamento for escolhido, o comportamento será diferente e os leitores não bloquearão os gravadores.)
No Oracle, um processo de leitura nunca bloqueará um processo de gravação. A seguir está um trecho de ' Oracle Database Concepts 11g Release 2 '. Convido você a dar uma olhada se estiver interessado em como isso é tratado pela Oracle.
O banco de dados mantém vários tipos diferentes de bloqueios, dependendo da operação que adquiriu o bloqueio. Em geral, o banco de dados utiliza dois tipos de bloqueios: bloqueios exclusivos e bloqueios de compartilhamento. Apenas um bloqueio exclusivo pode ser obtido em um recurso, como uma linha ou uma tabela, mas muitos bloqueios de compartilhamento podem ser obtidos em um único recurso.
Bloqueios afetam a interação de leitores e escritores. Um leitor é uma consulta de um recurso, enquanto um escritor é uma instrução que modifica um recurso. As regras a seguir resumem o comportamento de bloqueio do Oracle Database para leitores e gravadores:
•Uma linha é bloqueada apenas quando modificada por um gravador.
Quando uma instrução atualiza uma linha, a transação adquire um bloqueio somente para esta linha. Ao bloquear os dados da tabela no nível da linha, o banco de dados minimiza a contenção pelos mesmos dados. Em circunstâncias normais 1, o banco de dados não escala um bloqueio de linha para o nível de bloco ou tabela.
•Um gravador de uma linha bloqueia um gravador simultâneo da mesma linha.
Se uma transação estiver modificando uma linha, um bloqueio de linha impedirá que uma transação diferente modifique a mesma linha simultaneamente.
•Um leitor nunca bloqueia um escritor.
Como um leitor de uma linha não a bloqueia, um gravador pode modificar essa linha. A única exceção é uma instrução SELECT ... FOR UPDATE, que é um tipo especial de instrução SELECT que bloqueia a linha que está lendo.
•Um escritor nunca bloqueia um leitor.
Quando uma linha está sendo alterada por um gravador, o banco de dados usa dados de desfazer para fornecer aos leitores uma visualização consistente da linha.
O SQL Server normalmente usa uma estratégia de bloqueio diferente da Oracle. A estratégia padrão usada pelo SQL Server significa que a seleção de linhas faz com que bloqueios de leitura (em linhas, páginas ou na tabela inteira) sejam colocados nelas*. Portanto, às
NOLOCK
vezes é uma cláusula útil - embora o conselho geral seja nunca usá-la, pois altera a semântica dos níveis de isolamento e pode causar resultados inconsistentes na saída das consultas.* (Observação: esse é o padrão. Se o
SNAPSHOT
isolamento for escolhido, o comportamento será diferente e os leitores não bloquearão os gravadores.)No Oracle, um processo de leitura nunca bloqueará um processo de gravação. A seguir está um trecho de ' Oracle Database Concepts 11g Release 2 '. Convido você a dar uma olhada se estiver interessado em como isso é tratado pela Oracle.
Simultaneidade e consistência de dados