Verständnis 1 ist richtig. SQL Server zeichnet jeden Vorgang auf, der Daten im Transaktionsprotokoll ändert. Ein Rollback ist eine Datenänderung, die auch im Transaktionsprotokoll aufgezeichnet wird. Bei Ausführung von Anweisung A werden Daten in das Transaktionsprotokoll geschrieben und Daten im Transaktionsprotokoll reserviert, falls Anweisung A zurückgesetzt werden muss. Gleiches gilt für B und C. Wenn Sie die Transaktion zurücksetzen, werden weitere Informationen in das Protokoll geschrieben.
Es gibt viele Möglichkeiten, dies in Aktion zu sehen. Im Folgenden finden Sie eine kurze Demo. Hier ist die Abfrage, die ich verwenden werde, um zu sehen, was in das Protokoll geschrieben wurde:
SELECT
COUNT(*) transaction_count
, SUM(database_transaction_log_bytes_used) used_bytes
, SUM(database_transaction_log_bytes_reserved) reserved_bytes
FROM sys.dm_tran_database_transactions
where database_id = 10;
Mein Tisch:
create table TLOGDEMO (FLUFF VARCHAR(1000));
BEGIN TRANSACTION
Abfrage A verwendet minimale Protokollierung:
INSERT INTO TLOGDEMO WITH (TABLOCK)
SELECT REPLICATE('A', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Nach einer:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 24006640 ║ 175429451 ║
╚═══════════════════╩════════════╩════════════════╝
Abfrage B verwendet keine minimale Protokollierung:
INSERT INTO TLOGDEMO
SELECT REPLICATE('B', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Nach B:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7352935708 ║ 1613986255 ║
╚═══════════════════╩════════════╩════════════════╝
Abfrage C ändert weniger Daten:
INSERT INTO TLOGDEMO
SELECT REPLICATE('C', 1000)
FROM master..spt_values c;
Nach C:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7355821748 ║ 1614545331 ║
╚═══════════════════╩════════════╩════════════════╝
Jetzt werde ich ein ausstellen ROLLBACKund die DMV abfragen, während das Rollback stattfindet. Unten finden Sie eine Tabelle mit einigen Schnappschüssen:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7393305528 ║ 1573797677 ║
║ 1 ║ 7458767420 ║ 1502635737 ║
║ 1 ║ 7682482356 ║ 1259440979 ║
║ 1 ║ 7803881368 ║ 1127471233 ║
║ ... ║ ... ║ ... ║
╚═══════════════════╩════════════╩════════════════╝
Währenddessen nehmen die ROLLBACKverwendeten Bytes zu und die reservierte Anzahl von Bytes ab. Dies liegt daran, dass SQL Server den zuvor reservierten Speicherplatz verwendet, um die Transaktion rückgängig zu machen. Um die Transaktion rückgängig zu machen, müssen Daten geändert werden, damit mehr Daten in das Protokoll geschrieben werden.