O entendimento 1 está correto. O SQL Server registra todas as operações que alteram dados para o log de transações. Uma reversão é uma alteração nos dados, portanto, ela também registra isso no log de transações. Como a instrução A run, ela grava dados no log de transações e também reserva os dados no log de transações, caso a instrução A precise ser revertida. O mesmo vale para B e C. Quando você reverte a transação, mais informações serão gravadas no log.
Existem várias maneiras de ver isso em ação. Abaixo, uma demonstração rápida. Aqui está a consulta que usarei para ver o que foi gravado no log:
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;
Minha mesa:
create table TLOGDEMO (FLUFF VARCHAR(1000));
BEGIN TRANSACTION
A consulta A usa log mínimo:
INSERT INTO TLOGDEMO WITH (TABLOCK)
SELECT REPLICATE('A', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Após um:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 24006640 ║ 175429451 ║
╚═══════════════════╩════════════╩════════════════╝
A consulta B não usa log mínimo:
INSERT INTO TLOGDEMO
SELECT REPLICATE('B', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Depois de B:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7352935708 ║ 1613986255 ║
╚═══════════════════╩════════════╩════════════════╝
A consulta C altera menos dados:
INSERT INTO TLOGDEMO
SELECT REPLICATE('C', 1000)
FROM master..spt_values c;
Após C:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7355821748 ║ 1614545331 ║
╚═══════════════════╩════════════╩════════════════╝
Agora vou emitir um ROLLBACKe consultar o DMV enquanto a reversão acontece. Abaixo está uma tabela com alguns instantâneos:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7393305528 ║ 1573797677 ║
║ 1 ║ 7458767420 ║ 1502635737 ║
║ 1 ║ 7682482356 ║ 1259440979 ║
║ 1 ║ 7803881368 ║ 1127471233 ║
║ ... ║ ... ║ ... ║
╚═══════════════════╩════════════╩════════════════╝
Durante o ROLLBACK, os bytes usados aumentam e o número reservado de bytes diminui. Isso ocorre porque o SQL Server está usando o espaço reservado anteriormente para desfazer a transação. Para desfazer a transação, ele deve alterar os dados para gravar mais dados no log.