REVISIÓN: Volver a punto de almacenamiento produce errores y aserción

Seleccione idioma Seleccione idioma
Id. de artículo: 294902 - Ver los productos a los que se aplica este artículo
Error nº: 352501 (SHILOH_bugs)
Expandir todo | Contraer todo

Síntomas

Si un cliente asigna la primera, raíz y páginas de firstIAM de una tabla dentro de una transacción de usuario y el cliente utiliza el comando ROLLBACK para deshacer hasta un punto de almacenamiento dentro de esa misma transacción, puede producirse mensaje de error 3624 (aserción) y la conexión de cliente a SQL Server puede terminarse. Si se utiliza el Analizador de consultas como el cliente, se devuelve el mensaje de error siguiente en el Analizador de consultas:
Servidor: Msg 3624, nivel 20, estado 1, línea 1

Ubicación: page.cpp:2777
Expresión: rowLength > = offset + deleteLength
SPID: 51
ID. de proceso: 596

Conexión interrumpida
Además, 3448, errores 3314 y volcados de pila pueden aparecer en el archivo de registro de error de SQL Server.

Causa

En SQL Server 2000 se crean tablas como tablas vacías. Esto significa que cuando se crea una tabla páginas no se asignan a esa tabla. Las páginas se asignan a una tabla cuando se insertan datos en la tabla.

Por lo tanto, el siguiente escenario puede conducir a una aserción y mensajes de error:
  • Se inicia una transacción de usuario con la instrucción BEGIN TRAN.
  • Se crea una tabla con la instrucción CREATE TABLE.
  • Se especifica un punto de almacenamiento dentro de la transacción.
  • Instrucciones de lenguaje de manipulación (DML) de datos se aplican a la tabla mencionada en el segundo elemento de esta lista, asignar, por lo tanto, la primera raíz y las páginas de firstIAM de esa tabla.
  • Se utiliza el comando ROLLBACK para deshacer hasta el punto de almacenamiento mencionada en el tercer elemento de esta lista.
  • Instrucciones de DML adicionales se aplican a la tabla mencionada en el segundo elemento de esta lista.
Este problema se produce cuando las instrucciones DML adicionales mencionadas en el último elemento de la lista anterior no reasignar las páginas de la tabla. Instrucciones DML no reasignar las páginas de la tabla porque, basa en información de una caché de SQL Server no válida, piensan que ya se han asignado a la tabla de páginas. La caché de SQL Server no es consciente de que se deshacen las instrucciones DML que había asignado páginas de la tabla.

Solución

Para resolver este problema, consiga el Service Pack más reciente para SQL Server 2000. Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
290211INF: Cómo obtener el Service Pack más reciente de SQL Server 2000

Estado

Microsoft ha confirmado que este es un problema de SQL Server 2000. Este problema se corrigió por primera vez en SQL Server 2000 Service Pack 1.

Más información

Un punto de almacenamiento es un marcador dentro de una transacción que define una ubicación a la que puede devolver una transacción, si parte de la transacción se cancela condicionalmente. Para obtener más información acerca de punto de almacenamiento, consulte el tema "SAVE TRANSACTION" en los libros en pantalla de SQL Server.

Para reproducir el problema, ejecute la secuencia de comandos siguiente:
use master
go
create database repro
go
use repro
go
-- use tempdb
go
begin tran
go
create table t1 (i1 int null)
create table t2 (i2 int null)
go
-- SIMPLE WITH CHECK
--
create view vt as
  select * from t1 where i1 between 1 and 10
  with check option
go

save tran empty
go
insert vt values(1)	-- OK
insert vt values(5)	-- OK
insert vt values(10)	-- OK
insert vt values(0)	-- FAIL (<1)
insert vt values(11)	-- FAIL (>10)
insert vt values(null)	-- FAIL (null)
go
rollback tran empty
go

-- WITH CHECK JOIN
--
create view vtJN as
  select * from t1 inner join t2 on t1.i1 = t2.i2
  with check option
go

insert vtJN(i1) values(1)	-- FAIL (no match)
insert t2(i2) values(1)		-- OK (prime row)
insert vtJN(i1) values(1)	-- FAIL (no match)

				
aquí es el volcado de pila corto para esta aserción versión comercial de generación 8.00.194:
-------------------------------------------------------------------------------
Short Stack Dump
77F97AC6 Module(ntdll+00017AC6) (ZwGetContextThread+0000000B)
0092569E Module(sqlservr+0052569E) (utassert_fail(enum UTASSERT_TYPE,char const *,char const *,int,char const *,...)+000002E9)
00843FAC Module(sqlservr+00443FAC) (Page::ModifyRow(int,unsigned int,unsigned int,unsigned int,void const *,unsigned int,class XdesId const *)+000000D0)
0042DEAB Module(sqlservr+0002DEAB) (PageRef::ModifyRow(struct BUF *,int,unsigned int,unsigned int,unsigned int,void const *,enum ETabStatus,int,class XDES *,void const *,unsigned int)+0000033A)
0041CC24 Module(sqlservr+0001CC24) (AllocationReq::AllocatePages(void)+00000690)
0041B777 Module(sqlservr+0001B777) (AllocationReq::Allocate(void)+00000078)
0043EF30 Module(sqlservr+0003EF30) (AllocateHeapPage(struct CINSTABLE *)+0000007D)
0080C76D Module(sqlservr+0040C76D) (AllocatePageForInsert(class SDES *,struct INDEX *)+000000CD)
0043461A Module(sqlservr+0003461A) (FreeSpaceScan::GetNextPage(struct BUF * *)+000003B0)
00434A1B Module(sqlservr+00034A1B) (FindExistingFreeSpace(class SDES *,struct INDEX *,unsigned int,int &)+000000B8)
004348AD Module(sqlservr+000348AD) (ncinsert(class SDES * volatile,unsigned char *,int,class Scan_rid &)+00000081)
00418543 Module(sqlservr+00018543) (rowinsert(class SDES * volatile,void *,int,unsigned char)+00000118)
004185E0 Module(sqlservr+000185E0) (insert(class SDES *,void *,int)+00000013)
00433D8F Module(sqlservr+00033D8F) (RowsetSS::InsertRow(unsigned long,unsigned long,void *,unsigned long *)+00000201)
0042EE6A Module(sqlservr+0002EE6A) (CValRow::SetDataX(unsigned long *,class CXVariant *)+00000025)
00431C2F Module(sqlservr+00031C2F) (CEs::FastMoveEval(unsigned long *,class CEsExec *,class CXVariant *)+00000039)
00433FD6 Module(sqlservr+00033FD6) (CQScanScalarInsert::GetRow(unsigned long *,unsigned long *)+00000035)
0042C85E Module(sqlservr+0002C85E) (CQScanNLJoin::GetRow(unsigned long *,unsigned long *)+00000112)
004C09E1 Module(sqlservr+000C09E1) (CQScanAssert::GetRow(unsigned long *,unsigned long *)+0000001B)
00427985 Module(sqlservr+00027985) (CQueryScan::GetRow(unsigned long *,unsigned long *)+00000014)
00426F64 Module(sqlservr+00026F64) (CStmtQuery::ErsqExecuteQuery(class CMsqlExecContext *,class CEsComp const *,class CEsComp const *,unsigned long *,int,int)const +000003C4)
0042EA36 Module(sqlservr+0002EA36) (CStmtDML::XretExecuteNormal(class CMsqlExecContext *)const +000002F0)
0042E82D Module(sqlservr+0002E82D) (CStmtDML::XretExecute(class CMsqlExecContext *)const +0000001C)
004160DB Module(sqlservr+000160DB) (CMsqlExecContext::ExecuteStmts(class ExecutionContext *)+0000027E)
00415765 Module(sqlservr+00015765) (CMsqlExecContext::Execute(class CCompPlan *,class CParamExchange *)+000001C7)
00415410 Module(sqlservr+00015410) (CSQLSource::Execute(class CParamExchange *)+00000343)
005A683F Module(sqlservr+001A683F) (CStmtPrepQuery::XretExecute(class CMsqlExecContext *)const +00000211)
004160DB Module(sqlservr+000160DB) (CMsqlExecContext::ExecuteStmts(class ExecutionContext *)+0000027E)
00415765 Module(sqlservr+00015765) (CMsqlExecContext::Execute(class CCompPlan *,class CParamExchange *)+000001C7)
00415410 Module(sqlservr+00015410) (CSQLSource::Execute(class CParamExchange *)+00000343)
00459A54 Module(sqlservr+00059A54) (language_exec(struct srv_proc *)+000003C8)
004175D8 Module(sqlservr+000175D8) (process_commands(struct srv_proc *)+000000E0)
410735D0 Module(UMS+000035D0) (ProcessWorkRequests(class UmsWorkQueue *)+00000264)
4107382C Module(UMS+0000382C) (ThreadStartRoutine(void *)+000000BC)
7800BEA1 Module(MSVCRT+0000BEA1) (_beginthread+000000CE)
77E92CA8 Module(KERNEL32+00012CA8) (CreateFileA+0000011B)
-------------------------------------------------------------------------------
				
aquí es un volcado de pila corta con error 3448 en versión 8.00.194 de comercial:
-------------------------------------------------------------------------------
Short Stack Dump
77F97AC6 Module(ntdll+00017AC6) (ZwGetContextThread+0000000B)
00926069 Module(sqlservr+00526069) (ex_raise2(int,int,int,int,void *,char *)+00000174)
0046C368 Module(sqlservr+0006C368) (ex_raise(int,int,int,int,...)+00000063)
008686FE Module(sqlservr+004686FE) (FixPageForUndo(class PageRef &,class DBTABLE *,class LSN const &,enum LatchBase::LATCH_TYPE,class PageLog const &)+00000098)
00863962 Module(sqlservr+00463962) (XdesRMReadWrite::UndoPageOperation(class PageLog const *,class LSN const &,int)+0000032B)
00440FBA Module(sqlservr+00040FBA) (XdesRMReadWrite::RollbackToLsn(class LSN const &,class LogIterBackLink &,class IndexErrorTable *,int)+000002EB)
00865932 Module(sqlservr+00465932) (XdesRMFull::RollbackNested(int)+00000143)
0086062F Module(sqlservr+0046062F) (XactRM::RollbackNestedXact(int)+0000009E)
0085DEB5 Module(sqlservr+0045DEB5) (FullXactImpBase::RollbackNestedXact(int)+00000037)
0064089F Module(sqlservr+0024089F) (CMsqlXact::RollbackNestedXact(enum CMsqlXact::ReadWriteMode,int)+00000017)
006403DD Module(sqlservr+002403DD) (CAutoMsqlXact::RollbackNestedXact(void)+00000032)
0062F2D1 Module(sqlservr+0022F2D1) (CStmtDML::XretExecuteNormal(class CMsqlExecContext *)const +00000456)
0042E82D Module(sqlservr+0002E82D) (CStmtDML::XretExecute(class CMsqlExecContext *)const +0000001C)
004160DB Module(sqlservr+000160DB) (CMsqlExecContext::ExecuteStmts(class ExecutionContext *)+0000027E)
00415765 Module(sqlservr+00015765) (CMsqlExecContext::Execute(class CCompPlan *,class CParamExchange *)+000001C7)
00415410 Module(sqlservr+00015410) (CSQLSource::Execute(class CParamExchange *)+00000343)
005A683F Module(sqlservr+001A683F) (CStmtPrepQuery::XretExecute(class CMsqlExecContext *)const +00000211)
004160DB Module(sqlservr+000160DB) (CMsqlExecContext::ExecuteStmts(class ExecutionContext *)+0000027E)
00415765 Module(sqlservr+00015765) (CMsqlExecContext::Execute(class CCompPlan *,class CParamExchange *)+000001C7)
00415410 Module(sqlservr+00015410) (CSQLSource::Execute(class CParamExchange *)+00000343)
00459A54 Module(sqlservr+00059A54) (language_exec(struct srv_proc *)+000003C8)
004175D8 Module(sqlservr+000175D8) (process_commands(struct srv_proc *)+000000E0)
410735D0 Module(UMS+000035D0) (ProcessWorkRequests(class UmsWorkQueue *)+00000264)
4107382C Module(UMS+0000382C) (ThreadStartRoutine(void *)+000000BC)
7800BEA1 Module(MSVCRT+0000BEA1) (_beginthread+000000CE)
77E92CA8 Module(KERNEL32+00012CA8) (CreateFileA+0000011B)
-------------------------------------------------------------------------------
2001-03-30 03:08:44.56 spid51    Error: 3448, Severity: 21, State: 1
2001-03-30 03:08:44.56 spid51    Could not undo log record (5:23:99), for transaction ID (0:157), on page (1:76), database 'repro' (database ID 7). Page information: LSN = (5:23:96), type = 1. Log information: OpCode = 4, context 1..
2001-03-30 03:08:44.56 spid51    ex_raise2: Exception raised, major=34, minor=48, severity=25, attempting to create symptom dump
				

Propiedades

Id. de artículo: 294902 - Última revisión: jueves, 06 de noviembre de 2003 - Versión: 3.2
La información de este artículo se refiere a:
  • Microsoft SQL Server 2000 Standard Edition
Palabras clave: 
kbmt kbbug kbfix kbsqlserv2000sp1fix KB294902 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 294902

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com