Sou novo na Oracle e só quero confirmar minha compreensão da consistência de leitura em nível de instrução para Oracle 10g e 10g+.
O documento Oracle 10g afirma:
A Oracle sempre impõe consistência de leitura em nível de instrução. Isso garante que todos os dados retornados por uma única consulta venham de um único ponto no tempo — a hora em que a consulta começou . Portanto, uma consulta nunca vê dados sujos ou qualquer uma das alterações feitas por transações que são confirmadas durante a execução da consulta. À medida que a execução da consulta prossegue, apenas os dados confirmados antes do início da consulta ficam visíveis para a consulta. A consulta não vê as alterações confirmadas após o início da execução da instrução.
O documento Oracle 11g afirma:
O Oracle Database sempre impõe consistência de leitura em nível de instrução, o que garante que os dados retornados por uma única consulta sejam confirmados e consistentes em relação a um único ponto no tempo. O momento em que uma única instrução SQL é consistente depende do nível de isolamento da transação e da natureza da consulta :
No nível de isolamento de leitura confirmada, esse ponto é a hora em que a instrução foi aberta. Por exemplo, se uma instrução SELECT for aberta em SCN 1000, essa instrução será consistente com SCN 1000.
Em uma transação serializável ou somente leitura, esse ponto é a hora em que a transação começou. Por exemplo, se uma transação começar em SCN 1000 e se ocorrerem várias instruções SELECT nessa transação, cada instrução será consistente com SCN 1000.
Em uma operação Flashback Query (SELECT ... AS OF), a instrução SELECT especifica explicitamente o ponto no tempo. Por exemplo, você pode consultar uma tabela como ela apareceu na última quinta-feira às 14h
Veja o texto em negrito. Se bem entendi, a Oracle mudou seu comportamento entre 10g e 10g+. Em 10g, a consistência de leitura em nível de instrução é sempre baseada na exibição quando a instrução é iniciada. No 10g+, a consistência de leitura em nível de instrução é baseada em uma exibição que depende do nível de isolamento e da própria consulta. Meu entendimento está correto? Obrigada.
O comportamento não mudou. Tem sido o mesmo desde o Oracle 7 pelo menos (provavelmente antes, mas isso foi antes do meu tempo) e ainda é hoje com o Oracle 19. A documentação foi expandida para incluir o comportamento em níveis de isolamento diferentes do padrão READ COMMITTED, ou quando usando o mecanismo Flashback Query.
(Você realmente deveria estar olhando para a documentação mais recente: https://docs.oracle.com/en/database/oracle/oracle-database/index.html - 11g é muito antigo)
O ponto importante é que o isolamento padrão usado pelo Oracle (consistência em nível de instrução) implica que repetir a mesma instrução pode não fornecer o mesmo resultado, pois outras transações podem ter atualizado os dados durante a primeira execução da instrução. A Oracle usa a consistência de várias versões para fornecer acesso simultâneo de modo que os leitores não bloqueiem os gravadores e os gravadores não bloqueiem os leitores.