Ich habe das folgende Experiment ausprobiert und ähnliche Ergebnisse erhalten. In beiden Fällen zeigt fn_dblog (), dass ein Rollback stattfindet, und dies scheint in Szenario 2 schneller zu geschehen als in Szenario 1.
Übrigens habe ich sowohl MDF als auch LDF auf derselben externen Festplatte (USB 2.0) abgelegt.
Meine anfängliche Schlussfolgerung ist, dass es in diesem Fall keinen Unterschied in der Funktionsweise des Rollbacks gibt, und wahrscheinlich ist jeder offensichtliche Geschwindigkeitsunterschied auf das E / A-Subsystem zurückzuführen. Das ist im Moment nur meine Arbeitshypothese.
Szenario 1:
- Erstellen Sie eine Datenbank mit einer Protokolldatei, die bei 1 MB beginnt, in 4 MB großen Blöcken wächst und eine maximale Größe von 100 MB hat.
- Öffnen Sie eine explizite Transaktion, führen Sie sie 10 Sekunden lang aus und brechen Sie sie dann in SSMS manuell ab
- Sehen Sie sich die Anzahl der fn_dblog () und die Größe der Protokollreserve an und überprüfen Sie DBCC SQLPERF (LOGSPACE).
Szenario 2:
- Erstellen Sie eine Datenbank mit einer Protokolldatei, die bei 1 MB beginnt, in 4 MB großen Blöcken wächst und eine maximale Größe von 100 MB hat.
- Öffnen Sie eine explizite Transaktion und führen Sie sie aus, bis der vollständige Fehler im Protokoll angezeigt wird
- Sehen Sie sich die Anzahl der fn_dblog () und die Größe der Protokollreserve an und überprüfen Sie DBCC SQLPERF (LOGSPACE).
Ergebnisse der Leistungsüberwachung:
Szenario 1:
Szenario 2:
Code:
USE [master];
GEHEN
IF DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
START
ALTER DATABASE [SampleDB] SET SINGLE_USER
MIT ROLLBACK SOFORT;
DROP DATABASE [SampleDB];
ENDE;
GEHEN
CREATE DATABASE [SampleDB] ON PRIMARY
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, GRÖSSE = 3 MB
, FILEGROWTH = 1 MB
)
EINLOGGEN
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, GRÖSSE = 1 MB
, MAXSIZE = 100 MB
, FILEGROWTH = 4 MB
);
GEHEN
USE [SampleDB];
GEHEN
- Fügen Sie eine Tabelle hinzu
CREATE TABLE dbo.test
(
c1 CHAR (8000) NOT NULL DEFAULT REPLICATE ('a', 8000)
) ON [PRIMARY];
GEHEN
- Stellen Sie sicher, dass es sich nicht um ein pseudo-einfaches Wiederherstellungsmodell handelt
BACKUP DATABASE SampleDB
TO DISK = 'NUL';
GEHEN
- Sichern Sie die Protokolldatei
BACKUP LOG SampleDB
TO DISK = 'NUL';
GEHEN
- Überprüfen Sie den verwendeten Protokollspeicherplatz
DBCC SQLPERF (LOGSPACE);
GEHEN
- Wie viele Datensätze sind mit fn_dblog () sichtbar?
SELECT * FROM fn_dblog (NULL, NULL); - Gegen 9 in meinem Fall
/ ***********************************
SZENARIO 1
*********************************** /
- Öffnen Sie eine neue Transaktion und setzen Sie sie zurück
TRANSAKTION BEGINNEN
INSERT INTO dbo.test DEFAULT VALUES;
GO 10000 - Lassen Sie das Programm 10 Sekunden lang laufen und klicken Sie dann im SSMS-Abfragefenster auf Abbrechen
- Brechen Sie die Transaktion ab
- Der Vorgang sollte einige Sekunden dauern
- Sie müssen die Transaktion nicht zurücksetzen, da der Abbruch dies bereits für Sie erledigt hat.
-- Probier es einfach. Sie erhalten diesen Fehler
- Nachricht 3903, Ebene 16, Status 1, Zeile 1
- Die Anforderung ROLLBACK TRANSACTION hat keine entsprechende BEGIN TRANSACTION.
ROLLBACK-TRANSAKTION;
- Was ist der verwendete Protokollspeicherplatz? Über 100%.
DBCC SQLPERF (LOGSPACE);
GEHEN
- Wie viele Datensätze sind mit fn_dblog () sichtbar?
WÄHLEN *
FROM fn_dblog (NULL, NULL); - Ungefähr 91.926 in meinem Fall
- Gesamte Log-Reserve von fn_dblog () angezeigt?
SELECT SUM ([Log Reserve]) AS [Gesamte Log Reserve]
FROM fn_dblog (NULL, NULL); - Ungefähr 88,72 MB
/ ***********************************
SZENARIO 2
*********************************** /
- Die DB wegblasen und von vorne anfangen
USE [master];
GEHEN
IF DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
START
ALTER DATABASE [SampleDB] SET SINGLE_USER
MIT ROLLBACK SOFORT;
DROP DATABASE [SampleDB];
ENDE;
GEHEN
CREATE DATABASE [SampleDB] ON PRIMARY
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, GRÖSSE = 3 MB
, FILEGROWTH = 1 MB
)
EINLOGGEN
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, GRÖSSE = 1 MB
, MAXSIZE = 100 MB
, FILEGROWTH = 4 MB
);
GEHEN
USE [SampleDB];
GEHEN
- Fügen Sie eine Tabelle hinzu
CREATE TABLE dbo.test
(
c1 CHAR (8000) NOT NULL DEFAULT REPLICATE ('a', 8000)
) ON [PRIMARY];
GEHEN
- Stellen Sie sicher, dass es sich nicht um ein pseudo-einfaches Wiederherstellungsmodell handelt
BACKUP DATABASE SampleDB
TO DISK = 'NUL';
GEHEN
- Sichern Sie die Protokolldatei
BACKUP LOG SampleDB
TO DISK = 'NUL';
GEHEN
- Nun wollen wir die Protokolldatei innerhalb unserer Transaktion sprengen
TRANSAKTION BEGINNEN
INSERT INTO dbo.test DEFAULT VALUES;
GO 10000
- Das Rollback wird niemals ausgelöst. Versuch es. Sie erhalten eine Fehlermeldung.
- Nachricht 3903, Ebene 16, Status 1, Zeile 1
- Die Anforderung ROLLBACK TRANSACTION hat keine entsprechende BEGIN TRANSACTION.
ROLLBACK-TRANSAKTION;
- Ist die Protokolldatei zu 100% voll?
DBCC SQLPERF (LOGSPACE);
- Wie viele Datensätze sind mit fn_dblog () sichtbar?
WÄHLEN *
FROM fn_dblog (NULL, NULL); - Ungefähr 91.926 in meinem Fall
GEHEN
- Gesamte Log-Reserve von fn_dblog () angezeigt?
SELECT SUM ([Log Reserve]) AS [Gesamte Log Reserve]
FROM fn_dblog (NULL, NULL); - 88,72 MB
GEHEN