Comprendre 1 est correct. SQL Server enregistre chaque opération qui modifie les données dans le journal des transactions. Une restauration est une modification des données, elle enregistre également cela dans le journal des transactions. En tant qu'exécution de l'instruction A, il écrit des données dans le journal des transactions et réserve également des données dans le journal des transactions au cas où l'instruction A doit être annulée. Il en va de même pour B et C. Lorsque vous annulez la transaction, plus d'informations seront écrites dans le journal.
Il existe de nombreuses façons de voir cela en action, voici donc une démo rapide. Voici la requête que je vais utiliser pour voir ce qui a été écrit dans le journal:
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;
Ma table:
create table TLOGDEMO (FLUFF VARCHAR(1000));
BEGIN TRANSACTION
La requête A utilise une journalisation minimale:
INSERT INTO TLOGDEMO WITH (TABLOCK)
SELECT REPLICATE('A', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Après un:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 24006640 ║ 175429451 ║
╚═══════════════════╩════════════╩════════════════╝
La requête B n'utilise pas de journalisation minimale:
INSERT INTO TLOGDEMO
SELECT REPLICATE('B', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Après B:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7352935708 ║ 1613986255 ║
╚═══════════════════╩════════════╩════════════════╝
La requête C modifie moins de données:
INSERT INTO TLOGDEMO
SELECT REPLICATE('C', 1000)
FROM master..spt_values c;
Après C:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7355821748 ║ 1614545331 ║
╚═══════════════════╩════════════╩════════════════╝
Maintenant, je vais émettre un ROLLBACKet interroger le DMV pendant la restauration. Voici un tableau de quelques instantanés:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7393305528 ║ 1573797677 ║
║ 1 ║ 7458767420 ║ 1502635737 ║
║ 1 ║ 7682482356 ║ 1259440979 ║
║ 1 ║ 7803881368 ║ 1127471233 ║
║ ... ║ ... ║ ... ║
╚═══════════════════╩════════════╩════════════════╝
Pendant le ROLLBACK, les octets utilisés augmentent et le nombre d'octets réservés diminue. C'est parce que SQL Server utilise l'espace qu'il a mis de côté avant pour annuler la transaction. Pour annuler la transaction, il doit modifier les données afin d'écrire plus de données dans le journal.