CORRECÇÃO: Uma consulta poderá falhar com declaração de varejo ao usar a dica NOLOCK ou o nível de isolamento READ UNCOMMITTED

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 827714
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Quando você executa uma consulta com a dica NOLOCK ou com o nível de isolamento de transação definido como READ UNCOMMITTED e um usuário simultâneo é excluir linhas da tabela que é acessada pela consulta, a consulta pode falhar com uma declaração de varejo e você receberá uma mensagem de erro de declaração semelhante à seguinte:

Msg 3624
Local: Drive: \sql\ntdbms\storeng\drs\include\record.inl:1447
Expressão: m_SizeRec > 0 && m_SizeRec < = MAXDATAROW
SPID: 63
Identificação do processo: 1776
- ou -

Msg 3624
Local: recbase.cpp:1378
Expressão: m_offBeginVar < m_SizeRec
SPID: 55
Identificação do processo: 1776
Causa
Quando o mecanismo do Microsoft SQL Server tenta procurar por uma linha quando uma consulta usa a dica NOLOCK ou o nível de isolamento READ UNCOMMITTED transação, a linha de destino pode ser excluída. Antes de instalar essa correção, SQL Server 2000 incorretamente pode lidar com essa situação e a consulta pode falhar com a declaração é mencionada na seção "Sintomas" deste artigo.

Observação O nível de isolamento READ UNCOMMITTED transação também é conhecido como "leitura suja".
Resolução

Informações sobre o service pack

Para resolver esse problema, obtenha o service pack mais recente para o Microsoft SQL Server 2000. Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
290211Como obter o SQL Server 2000 service pack mais recente

Informações sobre o hotfix

A versão em inglês deste hotfix tem atributos de arquivo (ou atributos de arquivo posteriores) listados na tabela a seguir. As datas e horas desses arquivos são listadas na hora universal coordenada (UTC). Quando você exibe as informações do arquivo, ele é convertido para a hora local. Para encontrar a diferença entre o UTC e a hora local, use a guia fuso horário na ferramenta Data e hora no painel de controle.
   Date         Time   Version        Size       File name   ------------------------------------------------------------------   31-May-2003  06:15  2000.80.818.0     78,400  Console.exe   24-Jun-2003  12:31  2000.80.818.0     33,340  Dbmslpcn.dll   24-Apr-2003  13:42                   786,432  Distmdl.ldf   24-Apr-2003  13:42                 2,359,296  Distmdl.mdf   29-Jan-2003  13:25                       180  Drop_repl_hotfix.sql   26-Aug-2003  07:46  2000.80.854.0    528,960  Dtspump.dll   23-Jun-2003  10:10  2000.80.837.0  1,557,052  Dtsui.dll   23-Jun-2003  10:10  2000.80.837.0    639,552  Dtswiz.dll   23-Apr-2003  14:21                   747,927  Instdist.sql   02-May-2003  13:26                     1,581  Inst_repl_hotfix.sql   07-Feb-2003  18:10  2000.80.765.0     90,692  Msgprox.dll   31-Mar-2003  13:37                     1,873  Odsole.sql   04-Apr-2003  13:16  2000.80.800.0     62,024  Odsole70.dll   07-May-2003  08:11  2000.80.819.0     25,144  Opends60.dll   02-Apr-2003  09:18  2000.80.796.0     57,904  Osql.exe   02-Apr-2003  10:45  2000.80.797.0    279,104  Pfutil80.dll   04-Aug-2003  05:47                   550,780  Procsyst.sql   22-May-2003  10:27                    19,195  Qfe469571.sql   11-Jul-2003  04:34                 1,084,147  Replmerg.sql   04-Apr-2003  09:23  2000.80.798.0    221,768  Replprov.dll   07-Feb-2003  18:10  2000.80.765.0    307,784  Replrec.dll   13-Aug-2003  03:58                 1,086,797  Replsys.sql   13-Aug-2003  03:58                   986,603  Repltran.sql   29-Jul-2003  07:43  2000.80.819.0    492,096  Semobj.dll   31-May-2003  05:57  2000.80.818.0    172,032  Semobj.rll   05-Aug-2003  08:36                   127,884  Sp3_serv_uni.sql   31-May-2003  12:31  2000.80.818.0  4,215,360  Sqldmo.dll   07-Apr-2003  05:14                    25,172  Sqldumper.exe   19-Mar-2003  05:50  2000.80.789.0     28,672  Sqlevn70.rll   01-Jul-2003  11:48  2000.80.834.0    180,736  Sqlmap70.dll   02-Sep-2003  14:26  2000.80.857.0    188,992  Sqlmmc.dll   02-Sep-2003  10:33  2000.80.857.0    479,232  Sqlmmc.rll   07-Feb-2003  18:10  2000.80.765.0     57,920  Sqlrepss.dll   02-Sep-2003  14:27  2000.80.857.0  7,598,161  Sqlservr.exe   25-Jul-2003  09:14  2000.80.845.0    590,396  Sqlsort.dll   07-Feb-2003  18:10  2000.80.765.0     45,644  Sqlvdi.dll   24-Jun-2003  12:31  2000.80.818.0     33,340  Ssmslpcn.dll   31-May-2003  12:31  2000.80.818.0     82,492  Ssnetlib.dll   31-May-2003  12:31  2000.80.818.0     25,148  Ssnmpn70.dll   31-May-2003  12:31  2000.80.818.0    158,240  Svrnetcn.dll   31-May-2003  06:29  2000.80.818.0     76,416  Svrnetcn.exe   30-Apr-2003  11:22  2000.80.816.0     45,132  Ums.dll   01-Jul-2003  11:49  2000.80.834.0     98,816  Xpweb70.dll   23-Jun-2003  10:10  2000.80.837.0  1,557,052  Dtsui.dll   23-Jun-2003  10:10  2000.80.837.0    639,552  Dtswiz.dll   02-Apr-2003  09:18  2000.80.796.0     57,904  Osql.exe   02-Apr-2003  10:45  2000.80.797.0    279,104  Pfutil80.dll   29-Jul-2003  07:43  2000.80.819.0    492,096  Semobj.dll   31-May-2003  05:57  2000.80.818.0    172,032  Semobj.rll   31-May-2003  12:31  2000.80.818.0  4,215,360  Sqldmo.dll   07-Apr-2003  05:14                    25,172  Sqldumper.exe   02-Sep-2003  14:26  2000.80.857.0    188,992  Sqlmmc.dll   02-Sep-2003  10:33  2000.80.857.0    479,232  Sqlmmc.rll   31-May-2003  12:31  2000.80.818.0    158,240  Svrnetcn.dll   31-May-2003  06:29  2000.80.818.0     76,416  Svrnetcn.exe				
Observação Devido às dependências do arquivo, o hotfix mais recente ou o recurso que contém esses arquivos também pode conter arquivos adicionais.
Como Contornar
Para evitar esse problema, não use a dica NOLOCK ou o nível de isolamento de transação leitura UNCOMITTED ou, não execute a consulta quando as linhas afetadas são excluídas por outros usuários.
Situação
A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a". Esse problema foi corrigido primeiro no Microsoft SQL Server 2000 Service Pack 4.
Mais Informações
Após aplicar a correção mencionada na seção "Resolução" deste artigo e, em seguida, tentar acessar os registros excluídos, poderá receber a seguinte mensagem de erro em vez de uma declaração de varejo:

Msg 601
Não foi possível continuar a verificação com NOLOCK devido à movimentação de dados
Em algumas situações, o processador de consulta internamente pode manipular um erro 601 e pode ignorar silenciosamente a linha que levou ao erro 601. No entanto, em outros casos, esse comportamento não é possível acontecer e o processador de consultas deve falhar a consulta com um erro 601. Aplicativos que usam a dica NOLOCK ou o nível de isolamento READ UNCOMMITTED transação devem sempre conta para um possível erro 601 como parte do processamento de resultado típico e devem executar a ação apropriada descrita no SQL Server Books Online na descrição de "Erro 601". Para obter mais informações sobre erro 601, visite o seguinte tópico na livros online do SQL Server 2000:Antes de instalar esse hotfix, a linha de índice de cluster incorreto talvez tenham sido retornada para o processador de consultas. Esse comportamento não anteriormente causar uma falha de declaração, mas você pode perceber um erro 601 nessa situação com o hotfix instalado. Essas anomalias são um resultado de usar o NOLOCK dica ou o nível de isolamento READ UNCOMMITTED enquanto os usuários são atualizar ou excluir os dados ao mesmo tempo.

Quando ocorre o problema mencionado na seção "Sintomas" deste artigo, você pode observar que um despejo de pilha é gerado no log de erro do SQL Server e o despejo de pilha é seguido pela expressão declaração. O despejo de pilha gerado pode parecer com o despejo de pilha curto seguinte:
 Short Stack Dump 00871255 Module(sqlservr+00471255) (CStackDump::GetContextAndDump+0000002E) 00872C81 Module(sqlservr+00472C81) (stackTrace+0000021D) 009286FA Module(sqlservr+005286FA) (utassert_fail+000002E3) 007F12E8 Module(sqlservr+003F12E8) (RecBase::ReSizeVar+00000069) 00404DD9 Module(sqlservr+00004DD9) (RecBase::Resize+0000005B) 00429024 Module(sqlservr+00029024) (RowsetSS::GetColumns+000000B6) 0042AE29 Module(sqlservr+0002AE29) (RowsetSS::GetData+00000071) 00528CFF Module(sqlservr+00128CFF) (CValSSTable::GetDataWithBuffer+00000031) 00528CD3 Module(sqlservr+00128CD3) (GetDataWithBuffer+00000028) 00419B19 Module(sqlservr+00019B19) (CEs::GeneralEval4+00000075) 0042C37D Module(sqlservr+0002C37D) (CQScanHashMatch::Iterate+000015B4) 0042D80E Module(sqlservr+0002D80E) (CQScanHashMatch::Open+00000065) 0043D029 Module(sqlservr+0003D029) (CQScanNLJoin::Open+00000014) 0042970E Module(sqlservr+0002970E) (CQScan::Open+0000001C) 004297EB Module(sqlservr+000297EB) (CQScanStreamAggregate::Open+0000000E) 0041DB69 Module(sqlservr+0001DB69) (CQueryScan::Startup+0000010D) 0041955F Module(sqlservr+0001955F) (CStmtQuery::ErsqExecuteQuery+0000026B) 00428562 Module(sqlservr+00028562) (CStmtSelect::XretExecute+00000229) 00410855 Module(sqlservr+00010855) (CMsqlExecContext::ExecuteStmts+000003DD) 0040FEB4 Module(sqlservr+0000FEB4) (CMsqlExecContext::Execute+000001B6) 0041164F Module(sqlservr+0001164F) (CSQLSource::Execute+00000331) 004BA63E Module(sqlservr+000BA63E) (CStmtExec::XretLocalExec+0000014D Line 4058+0000002F) 004BA4DA Module(sqlservr+000BA4DA) (CStmtExec::XretExecute+0000031A Line 3990+00000017) 00410855 Module(sqlservr+00010855) (CMsqlExecContext::ExecuteStmts+000003DD) 0040FEB4 Module(sqlservr+0000FEB4) (CMsqlExecContext::Execute+000001B6) 0041164F Module(sqlservr+0001164F) (CSQLSource::Execute+00000331) 0053EC96 Module(sqlservr+0013EC96) (language_exec+000003E1) 0041226E Module(sqlservr+0001226E) (process_commands+000000EC) 41073379 Module(UMS+00003379) (ProcessWorkRequests+0000024A) 41073071 Module(UMS+00003071) (ThreadStartRoutine+000000BD) 7800C9EB Module(MSVCRT+0000C9EB) (exception::exception+0000000E) 77E8B2D8 Module(KERNEL32+0000B2D8) (lstrcmpiW+000000B7)2003-08-19 10:56:52.97 spid62    SQL Server Assertion: File: <recbase.cpp>, line=1378Failed Assertion = 'm_offBeginVar < m_SizeRec'.


Observação Algumas partes das informações de despejo de pilha e a expressão de declaração podem ser diferentes devido das seguintes razões:
  • O plano de execução de consulta que é usado pelo processador de consulta para executar a consulta é diferente.
  • A diferença no tempo da exclusão de linha e a avaliação da consulta.

Se a condição que é mencionada neste artigo não se aplicar, a declaração que você encontrou no arquivo Recbase.cpp pode ter ocorrido devido a um outro motivo.

Para obter mais informações sobre erros de declaração que são relatados de Recbase.cpp, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
828337Uma declaração no arquivo Recbase.cpp ou o arquivo Record.inl pode ocorrer quando uma operação é executada em uma instância do SQL Server

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 827714 - Última Revisão: 12/08/2015 04:34:00 - Revisão: 4.5

Microsoft SQL Server 2000 Developer Edition, Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 2000 Enterprise Edition, Microsoft SQL Server 2000 Personal Edition, Microsoft SQL Server 2000 Workgroup Edition, Microsoft SQL Server 2000 Desktop Engine (Windows), Microsoft SQL Server 2000 Enterprise Edition 64-bit

  • kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbquery kberrmsg kbtsql kbsqlserv2000presp4fix kbfix kbbug KB827714 KbMtpt
Comentários