Zrozumienie 1 jest poprawne. SQL Server rejestruje każdą operację, która zmienia dane w dzienniku transakcji. Wycofanie jest zmianą danych, więc zapisuje to również w dzienniku transakcji. Jako instrukcja A zapisuje dane w dzienniku transakcji, a także rezerwuje dane w dzienniku transakcji na wypadek, gdyby instrukcja A musiała zostać wycofana. To samo dotyczy B i C. Po wycofaniu transakcji więcej informacji zostanie zapisanych w dzienniku.
Istnieje wiele sposobów, aby zobaczyć to w akcji, dlatego poniżej znajduje się szybka prezentacja. Oto zapytanie, którego użyję, aby zobaczyć, co zostało zapisane w dzienniku:
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;
Mój stół:
create table TLOGDEMO (FLUFF VARCHAR(1000));
BEGIN TRANSACTION
Zapytanie A korzysta z minimalnego rejestrowania:
INSERT INTO TLOGDEMO WITH (TABLOCK)
SELECT REPLICATE('A', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Po:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 24006640 ║ 175429451 ║
╚═══════════════════╩════════════╩════════════════╝
Kwerenda B nie używa rejestrowania minimalnego:
INSERT INTO TLOGDEMO
SELECT REPLICATE('B', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Po B:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7352935708 ║ 1613986255 ║
╚═══════════════════╩════════════╩════════════════╝
Zapytanie C zmienia mniej danych:
INSERT INTO TLOGDEMO
SELECT REPLICATE('C', 1000)
FROM master..spt_values c;
Po C:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7355821748 ║ 1614545331 ║
╚═══════════════════╩════════════╩════════════════╝
Teraz wydam ROLLBACK
i zapytam DMV podczas wycofywania. Poniżej znajduje się tabela kilku migawek:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7393305528 ║ 1573797677 ║
║ 1 ║ 7458767420 ║ 1502635737 ║
║ 1 ║ 7682482356 ║ 1259440979 ║
║ 1 ║ 7803881368 ║ 1127471233 ║
║ ... ║ ... ║ ... ║
╚═══════════════════╩════════════╩════════════════╝
W ciągu ROLLBACK
używanych bajtów wzrasta, a zarezerwowana liczba bajtów maleje. Wynika to z faktu, że SQL Server wykorzystuje wcześniej zarezerwowane miejsce do cofnięcia transakcji. Aby cofnąć transakcję, musi zmienić dane, aby zapisać więcej danych w dzienniku.