La comprensione di 1 è corretta. SQL Server registra ogni operazione che modifica i dati nel registro delle transazioni. Un rollback è una modifica ai dati, quindi registra anche quello nel registro delle transazioni. Come istruzione A, scriverà i dati nel registro delle transazioni e prenoterà anche i dati nel registro delle transazioni nel caso in cui sia necessario ripristinare l'istruzione A. Lo stesso vale per B e C. Quando si esegue il rollback della transazione, nel registro verranno scritte più informazioni.
Ci sono molti modi per vederlo in azione, quindi di seguito è una breve demo. Ecco la query che userò per vedere cosa è stato scritto nel 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;
Il mio tavolo:
create table TLOGDEMO (FLUFF VARCHAR(1000));
BEGIN TRANSACTION
La query A utilizza la registrazione minima:
INSERT INTO TLOGDEMO WITH (TABLOCK)
SELECT REPLICATE('A', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Dopo un:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 24006640 ║ 175429451 ║
╚═══════════════════╩════════════╩════════════════╝
La query B non utilizza la registrazione minima:
INSERT INTO TLOGDEMO
SELECT REPLICATE('B', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Dopo B:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7352935708 ║ 1613986255 ║
╚═══════════════════╩════════════╩════════════════╝
La query C modifica meno dati:
INSERT INTO TLOGDEMO
SELECT REPLICATE('C', 1000)
FROM master..spt_values c;
Dopo C:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7355821748 ║ 1614545331 ║
╚═══════════════════╩════════════╩════════════════╝
Ora emetterò un ROLLBACKe interrogherò il DMV mentre avviene il rollback. Di seguito è riportata una tabella di alcune istantanee:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7393305528 ║ 1573797677 ║
║ 1 ║ 7458767420 ║ 1502635737 ║
║ 1 ║ 7682482356 ║ 1259440979 ║
║ 1 ║ 7803881368 ║ 1127471233 ║
║ ... ║ ... ║ ... ║
╚═══════════════════╩════════════╩════════════════╝
Durante il ROLLBACK, i byte usati aumentano e il numero riservato di byte diminuisce. Questo perché SQL Server sta utilizzando lo spazio riservato prima per annullare la transazione. Per annullare la transazione, è necessario modificare i dati in modo che scriva più dati nel registro.