É bem conhecido que o isolamento Read Committed é propenso a diferentes anomalias. Li a série de The Great Paul White sobre níveis de isolamento. O post relevante para a discussão é este:
Ele afirma (novamente, é razoavelmente bem conhecido), que uma instrução executada sob isolamento de leitura confirmada:
Can encounter the same row multiple times;
Can miss some rows completely;
Minha pergunta é sobre a parte das 'linhas ausentes'. Exemplos que falam sobre linhas ausentes geralmente demonstram o problema usando consultas como:
select count(*) from table
.
Minha pergunta é que as linhas podem ser perdidas em uma consulta de seleção 'regular' ? Ou seja, uma consulta como
select * from table
ou mesmo
select * from table where id = @id
também perder as linhas que são confirmadas antes do início dessa consulta? Esta pergunta se aplica apenas a Read confirmada com bloqueio (não RCSI), pois o RCSI não permite esses tipos de anomalias.
Um cenário em que as linhas confirmadas antes do início da
SELECT
consulta podem ser perdidas é quando um valor de chave de índice é atualizado. Considere esta consulta:O plano de execução provavelmente executará uma varredura em cluster ordenada para retornar todas as colunas. Se um valor de chave for atualizado e confirmado durante a varredura e o novo valor for menor que o ponto de varredura ordenado no momento da atualização, a linha não será retornada.
Com esta consulta:
A linha não será perdida se
id
for a chave primária e uma busca singleton for usada. Mas no caso de uma busca/varredura de índice não exclusivo onde o valor da chave é atualizado e confirmado durante a varredura, a linha pode ou não ser retornada dependendo do ponto de varredura e do momento da atualização.