Ho provato il seguente esperimento e ho ottenuto risultati simili. In entrambi i casi, fn_dblog () mostra il rollback che si verifica e sembra accadere più velocemente nello scenario 2 che nello scenario 1.
A proposito, ho posizionato sia MDF che LDF sullo stesso singolo disco esterno (USB 2.0).
La mia conclusione iniziale è che in questo caso non vi è alcuna differenza nel funzionamento del rollback e probabilmente qualsiasi differenza di velocità apparente è correlata al sottosistema I / O. Questa è solo la mia ipotesi di lavoro al momento.
Scenario 1:
- Creare un database con un file di registro che inizia a 1 MB, cresce in blocchi di 4 MB e ha una dimensione massima di 100 MB.
- Aprire una transazione esplicita, eseguirla per 10 secondi, quindi annullarla manualmente in SSMS
- Guarda il conteggio fn_dblog () e registra la dimensione della riserva e controlla DBCC SQLPERF (LOGSPACE)
Scenario 2:
- Creare un database con un file di registro che inizia a 1 MB, cresce in blocchi di 4 MB e ha una dimensione massima di 100 MB.
- Aprire una transazione esplicita, eseguirla fino a quando non viene visualizzato l'errore completo del registro
- Guarda il conteggio fn_dblog () e registra la dimensione della riserva e controlla DBCC SQLPERF (LOGSPACE)
Risultati di Performance Monitor:
Scenario 1:
Scenario 2:
Codice:
USE [master];
PARTIRE
SE DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
INIZIO
ALTER DATABASE [SampleDB] SET SINGLE_USER
CON ROLLBACK IMMEDIATO;
DROP DATABASE [SampleDB];
FINE;
PARTIRE
CREA DATABASE [SampleDB] SU PRIMARY
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, DIMENSIONE = 3 MB
, FILEGROWTH = 1 MB
)
ACCEDERE
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, DIMENSIONE = 1 MB
, MAXSIZE = 100 MB
, FILEGROWTH = 4 MB
);
PARTIRE
USE [SampleDB];
PARTIRE
- Aggiungi una tabella
CREA TABELLA dbo.test
(
c1 CHAR (8000) NON NULL DEFAULT REPLICATE ('a', 8000)
) SU [PRIMARIO];
PARTIRE
- Assicurarsi che non lo siamo è un modello di recupero pseudo-semplice
DATABASE DI BACKUP SampleDB
TO DISK = 'NUL';
PARTIRE
- Eseguire il backup del file di registro
BACKUP LOG SampleDB
TO DISK = 'NUL';
PARTIRE
- Controllare lo spazio del registro utilizzato
DBCC SQLPERF (LOGSPACE);
PARTIRE
- Quanti record sono visibili con fn_dblog ()?
SELEZIONA * DA fn_dblog (NULL, NULL); - Circa 9 nel mio caso
/ **********************************
SCENARIO 1
********************************** /
- Aprire una nuova transazione e quindi ripristinarla
INIZIA TRANSAZIONE
INSERISCI SU dbo.test VALORI PREDEFINITI;
GO 10000: lasciare funzionare per 10 secondi, quindi premere Annulla nella finestra delle query SSMS
- Annulla la transazione
- Dovrebbero essere necessari alcuni secondi per terminare
- Non è necessario eseguire il rollback della transazione, poiché l'annullamento l'ha già fatto per te.
- Provaci. Otterrai questo errore
- Messaggio 3903, livello 16, stato 1, riga 1
- La richiesta TRANSAZIONE ROLLBACK non ha OPERAZIONI INIZIALI corrispondenti.
TRANSAZIONE ROLLBACK;
- Qual è lo spazio di registro utilizzato? Superiore al 100%
DBCC SQLPERF (LOGSPACE);
PARTIRE
- Quanti record sono visibili con fn_dblog ()?
SELEZIONARE *
FROM fn_dblog (NULL, NULL); - Circa 91.926 nel mio caso
- Riserva di registro totale mostrata da fn_dblog ()?
SELECT SUM ([Log Reserve]) AS [Total Log Reserve]
FROM fn_dblog (NULL, NULL); - Circa 88,72 MB
/ **********************************
SCENARIO 2
********************************** /
- Soffiare via il DB e ricominciare
USE [master];
PARTIRE
SE DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
INIZIO
ALTER DATABASE [SampleDB] SET SINGLE_USER
CON ROLLBACK IMMEDIATO;
DROP DATABASE [SampleDB];
FINE;
PARTIRE
CREA DATABASE [SampleDB] SU PRIMARY
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, DIMENSIONE = 3 MB
, FILEGROWTH = 1 MB
)
ACCEDERE
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, DIMENSIONE = 1 MB
, MAXSIZE = 100 MB
, FILEGROWTH = 4 MB
);
PARTIRE
USE [SampleDB];
PARTIRE
- Aggiungi una tabella
CREA TABELLA dbo.test
(
c1 CHAR (8000) NON NULL DEFAULT REPLICATE ('a', 8000)
) SU [PRIMARIO];
PARTIRE
- Assicurarsi che non lo siamo è un modello di recupero pseudo-semplice
DATABASE DI BACKUP SampleDB
TO DISK = 'NUL';
PARTIRE
- Eseguire il backup del file di registro
BACKUP LOG SampleDB
TO DISK = 'NUL';
PARTIRE
- Ora, facciamo saltare il file di registro all'interno della nostra transazione
INIZIA TRANSAZIONE
INSERISCI SU dbo.test VALORI PREDEFINITI;
GO 10000
- Il rollback non si attiva mai. Provalo. Riceverai un errore.
- Messaggio 3903, livello 16, stato 1, riga 1
- La richiesta TRANSAZIONE ROLLBACK non ha OPERAZIONI INIZIALI corrispondenti.
TRANSAZIONE ROLLBACK;
- Il file di registro è pieno al 100%?
DBCC SQLPERF (LOGSPACE);
- Quanti record sono visibili con fn_dblog ()?
SELEZIONARE *
FROM fn_dblog (NULL, NULL); - Circa 91.926 nel mio caso
PARTIRE
- Riserva di registro totale mostrata da fn_dblog ()?
SELECT SUM ([Log Reserve]) AS [Total Log Reserve]
FROM fn_dblog (NULL, NULL); - 88,72 MB
PARTIRE