FIX: Rollback per il punto di salvataggio causa errori e di asserzione

Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 294902
Questo articolo è stato archiviato. L’articolo, quindi, viene offerto “così come è” e non verrà più aggiornato.
BUG #: 352501 (SHILOH_bugs)
Sintomi
Se un client alloca la prima, principale e firstIAM pagine di una tabella all'interno di una transazione utente e il client utilizza il comando ROLLBACK eseguire il rollback di un punto di salvataggio all'interno della stessa transazione, messaggio di errore può verificarsi la build (asserzione finale) e la connessione di client a SQL Server può essere terminati. Il seguente messaggio di errore viene generato in Query Analyzer, se Query Analyzer viene utilizzato come il client:
Server: Messaggio build, livello 20, stato 1, riga 1

Posizione: page.cpp:2777
Espressione: rowLength > = offset + deleteLength
SPID: 51
ID processo: 596

Connessione interrotti
Inoltre, gli errori 3448, 3314 e dump dello stack potrebbe essere visualizzato nel file di log degli errori di SQL Server.
Cause
In SQL Server 2000 vengono create tabelle come tabelle vuote. Pertanto, quando viene creata una tabella non pagine sono allocate alla tabella. Pagine sono allocate a una tabella quando i dati viene inseriti nella tabella.

Di conseguenza, nello scenario riportato di seguito può causare un'asserzione e messaggi di errori:
  • Una transazione utente viene avviata con l'istruzione BEGIN TRAN.
  • Una tabella viene creata con l'istruzione CREATE TABLE.
  • Un punto di salvataggio è specificato nell'ambito della transazione.
  • Istruzioni DML (Manipulation Language) dei dati vengono applicate alla tabella indicata nella seconda voce dell'elenco, pertanto l'allocazione il primo, pagine principali e firstIAM della tabella.
  • Il comando ROLLBACK viene utilizzato per il rollback per il punto di salvataggio indicato nel terzo elemento dell'elenco.
  • Ulteriori istruzioni DML vengono applicate alla tabella indicata nella seconda voce dell'elenco.
Questo problema si verifica quando le istruzioni DML aggiuntive descritte in l'ultimo elemento dell'elenco precedente non riassegna pagine per la tabella. Le istruzioni DML non riallocare le pagine per la tabella poiché, in base alle informazioni da una cache di SQL Server non valida, essi considerano che le pagine già allocate alla tabella. Cache di SQL Server non riconosce che le istruzioni DML sono allocate pagine per la tabella sono state annullate.
Risoluzione
Per risolvere il problema, ottenere il service pack più recente per SQL Server 2000. Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
290211INF: Come ottenere il Service Pack più recente per SQL Server 2000
Status
Microsoft ha confermato che questo problema riguarda SQL Server 2000. Il problema è stato risolto nel Service Pack 1 per SQL Server 2000.
Informazioni
Un punto di salvataggio è un indicatore all'interno di una transazione che definisce una posizione a cui può restituire una transazione, se parte della transazione viene annullata in modo condizionale. Per ulteriori informazioni su un punto di salvataggio, vedere l'argomento "SAVE TRANSACTION" nella documentazione in linea di SQL Server.

Per riprodurre il problema, eseguire lo script seguente:
use mastergocreate database reprogouse reprogo-- use tempdbgobegin trangocreate 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 optiongosave tran emptygoinsert vt values(1)	-- OKinsert vt values(5)	-- OKinsert vt values(10)	-- OKinsert vt values(0)	-- FAIL (<1)insert vt values(11)	-- FAIL (>10)insert vt values(null)	-- FAIL (null)gorollback tran emptygo-- WITH CHECK JOIN--create view vtJN as  select * from t1 inner join t2 on t1.i1 = t2.i2  with check optiongoinsert vtJN(i1) values(1)	-- FAIL (no match)insert t2(i2) values(1)		-- OK (prime row)insert vtJN(i1) values(1)	-- FAIL (no match)				
qui è il dump dello stack breve per questa asserzione su finale generazione 8.00.194:
-------------------------------------------------------------------------------Short Stack Dump77F97AC6 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)-------------------------------------------------------------------------------				
qui è un dump dello stack breve con errore 3448 nella build finale 8.00.194:
-------------------------------------------------------------------------------Short Stack Dump77F97AC6 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: 12001-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				

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 294902 - Ultima revisione: 01/16/2015 22:12:51 - Revisione: 3.2

Microsoft SQL Server 2000 Standard Edition

  • kbnosurvey kbarchive kbmt kbbug kbfix kbsqlserv2000sp1fix KB294902 KbMtit
Feedback