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롤백이 발생하는 동안 a를 발행 하고 DMV를 쿼리합니다. 다음은 몇 가지 스냅 샷 표입니다.
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7393305528 ║ 1573797677 ║
║ 1 ║ 7458767420 ║ 1502635737 ║
║ 1 ║ 7682482356 ║ 1259440979 ║
║ 1 ║ 7803881368 ║ 1127471233 ║
║ ... ║ ... ║ ... ║
╚═══════════════════╩════════════╩════════════════╝
동안 ROLLBACK사용 된 바이트 수가 증가하고 예약 된 바이트 수가 줄어 듭니다. SQL Server가 트랜잭션을 실행 취소하기 위해 따로 설정 한 공간을 사용하고 있기 때문입니다. 트랜잭션을 취소하려면 더 많은 데이터를 로그에 쓰도록 데이터를 변경해야합니다.