Por que a Oracle não possui nolock?

14

No MS SQL Server nolockpode ser usado para esse fim.

Por que não podemos usá-lo no Oracle e plsql?

sal
fonte

Respostas:

20

O SQL Server normalmente usa uma estratégia de bloqueio diferente do Oracle. A estratégia padrão usada pelo SQL Server significa que a seleção de linhas faz com que os bloqueios de leitura (nas linhas, nas páginas ou em toda a tabela) sejam colocados *. Daí aNOLOCK 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.

* (Nota: 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 bloqueia um processo de gravação. A seguir, 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

Resumo do comportamento de bloqueio

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 usa dois tipos de bloqueios: bloqueios exclusivos e bloqueios de compartilhamento. Somente 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.

Os bloqueios afetam a interação de leitores e escritores. Um leitor é uma consulta de um recurso, enquanto um escritor é uma declaração que modifica um recurso. As regras a seguir resumem o comportamento de bloqueio do banco de dados Oracle para leitores e gravadores:

• Uma linha é bloqueada apenas quando modificada por um gravador.

Quando um extrato atualiza uma linha, a transação adquire um bloqueio apenas para esta linha. Ao bloquear os dados da tabela no nível da linha, o banco de dados minimiza a contenção para os mesmos dados. Sob circunstâncias normais 1, o banco de dados não encaminha 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 o leitor de uma linha não a bloqueia, um escritor 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 desfazer dados para fornecer aos leitores uma visão consistente da linha.

BriteSponge
fonte