1を理解するのは正しいことです。SQL Serverは、データを変更するすべての操作をトランザクションログに記録します。ロールバックはデータの変更であるため、トランザクションログにも記録されます。ステートメントAが実行されると、トランザクションログにデータが書き込まれ、また、ステートメントAをロールバックする必要がある場合に備えて、トランザクションログにデータが予約されます。BとCについても同じことが言えます。トランザクションをロールバックすると、より多くの情報がログに書き込まれます。
これを実際に見る方法はたくさんあるので、以下に簡単なデモを示します。ログに書き込まれた内容を確認するために使用するクエリを次に示します。
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;
私のテーブル:
create table TLOGDEMO (FLUFF VARCHAR(1000));
BEGIN TRANSACTION
クエリAは最小限のログを使用します。
INSERT INTO TLOGDEMO WITH (TABLOCK)
SELECT REPLICATE('A', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Aの後:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 24006640 ║ 175429451 ║
╚═══════════════════╩════════════╩════════════════╝
クエリBは最小限のログを使用しません。
INSERT INTO TLOGDEMO
SELECT REPLICATE('B', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Bの後:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7352935708 ║ 1613986255 ║
╚═══════════════════╩════════════╩════════════════╝
クエリCが変更するデータが少ない:
INSERT INTO TLOGDEMO
SELECT REPLICATE('C', 1000)
FROM master..spt_values c;
Cの後:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7355821748 ║ 1614545331 ║
╚═══════════════════╩════════════╩════════════════╝
ここでROLLBACK
、ロールバックが発生している間にDMVを発行してクエリします。以下は、いくつかのスナップショットの表です。
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7393305528 ║ 1573797677 ║
║ 1 ║ 7458767420 ║ 1502635737 ║
║ 1 ║ 7682482356 ║ 1259440979 ║
║ 1 ║ 7803881368 ║ 1127471233 ║
║ ... ║ ... ║ ... ║
╚═══════════════════╩════════════╩════════════════╝
の間にROLLBACK
、使用されるバイトが増加し、予約済みのバイト数が減少します。これは、SQL Serverがトランザクションを元に戻すために以前に確保したスペースを使用しているためです。トランザクションを元に戻すには、データを変更して、より多くのデータをログに書き込む必要があります。