Розуміння 1 правильне. SQL Server записує кожну операцію, яка змінює дані в журнал транзакцій. Відкат - це зміна даних, тому він також записує їх до журналу транзакцій. Як оператор A run, він записує дані в журнал транзакцій, а також резервує дані в журналі транзакцій у випадку, якщо оператор 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 використовує простір, відведений йому раніше для скасування транзакції. Для скасування транзакції він повинен змінити дані, щоб він записував більше даних у журнал.