Entender 1 es correcto. SQL Server registra cada operación que cambia los datos al registro de transacciones. Una reversión es un cambio en los datos, por lo que también se registra en el registro de transacciones. Como ejecución de la declaración A, escribirá datos en el registro de transacciones y también reservará datos en el registro de transacciones en caso de que la declaración A deba revertirse. Lo mismo es cierto para B y C. Cuando revierta la transacción, se escribirá más información en el registro.
Hay muchas maneras de ver esto en acción, así que a continuación se muestra una demostración rápida. Aquí está la consulta que usaré para ver lo que se escribió en el registro:
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;
Mi mesa:
create table TLOGDEMO (FLUFF VARCHAR(1000));
BEGIN TRANSACTION
La consulta A usa un registro mínimo:
INSERT INTO TLOGDEMO WITH (TABLOCK)
SELECT REPLICATE('A', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Después de:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 24006640 ║ 175429451 ║
╚═══════════════════╩════════════╩════════════════╝
La consulta B no usa un registro mínimo:
INSERT INTO TLOGDEMO
SELECT REPLICATE('B', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Después de B:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7352935708 ║ 1613986255 ║
╚═══════════════════╩════════════╩════════════════╝
La consulta C cambia menos datos:
INSERT INTO TLOGDEMO
SELECT REPLICATE('C', 1000)
FROM master..spt_values c;
Después de C:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7355821748 ║ 1614545331 ║
╚═══════════════════╩════════════╩════════════════╝
Ahora emitiré ROLLBACK
y consultaré el DMV mientras ocurre la reversión. A continuación se muestra una tabla de algunas instantáneas:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7393305528 ║ 1573797677 ║
║ 1 ║ 7458767420 ║ 1502635737 ║
║ 1 ║ 7682482356 ║ 1259440979 ║
║ 1 ║ 7803881368 ║ 1127471233 ║
║ ... ║ ... ║ ... ║
╚═══════════════════╩════════════╩════════════════╝
Durante el ROLLBACK
, los bytes utilizados aumentan y el número reservado de bytes disminuye. Esto se debe a que SQL Server está utilizando el espacio que reservaba antes para deshacer la transacción. Para deshacer la transacción, debe cambiar los datos para que escriba más datos en el registro.