1'i anlamak doğrudur. SQL Server, verileri işlem günlüğüne değiştiren her işlemi kaydeder. Geri alma, verilerdeki bir değişikliktir, böylece bunu işlem günlüğüne de kaydeder. A ifadesi çalıştırması olarak, işlem günlüğüne veri yazacak ve ayrıca A ifadesinin geri alınması gerektiğinde işlem günlüğüne veri ayıracaktır. Aynı durum B ve C için de geçerlidir. İşlemi geri aldığınızda günlüğe daha fazla bilgi yazılır.
Bunu eylemde görmenin birçok yolu var, bu yüzden aşağıda hızlı bir demo. İşte günlüğe yazılanları görmek için kullanacağım sorgu:
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;
Benim masam:
create table TLOGDEMO (FLUFF VARCHAR(1000));
BEGIN TRANSACTION
A sorgusu en az günlük kaydı kullanır:
INSERT INTO TLOGDEMO WITH (TABLOCK)
SELECT REPLICATE('A', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
A sonrası:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 24006640 ║ 175429451 ║
╚═══════════════════╩════════════╩════════════════╝
Sorgu B, minimum günlük kaydı kullanmaz:
INSERT INTO TLOGDEMO
SELECT REPLICATE('B', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
B'den Sonra:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7352935708 ║ 1613986255 ║
╚═══════════════════╩════════════╩════════════════╝
C sorgusu daha az veri değiştirir:
INSERT INTO TLOGDEMO
SELECT REPLICATE('C', 1000)
FROM master..spt_values c;
C'den sonra:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7355821748 ║ 1614545331 ║
╚═══════════════════╩════════════╩════════════════╝
Şimdi bir ROLLBACKgeri vereceğim ve geri alma gerçekleşirken DMV'yi sorgulayacağım. Aşağıda birkaç fotoğraftan oluşan bir tablo bulunmaktadır:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7393305528 ║ 1573797677 ║
║ 1 ║ 7458767420 ║ 1502635737 ║
║ 1 ║ 7682482356 ║ 1259440979 ║
║ 1 ║ 7803881368 ║ 1127471233 ║
║ ... ║ ... ║ ... ║
╚═══════════════════╩════════════╩════════════════╝
Boyunca ROLLBACK, ikinci bayt artar ve bayt ayrılmış sayısı azalır. Bunun nedeni, SQL Server'ın işlemi geri almak için daha önce ayırdığı alanı kullanmasıdır. İşlemi geri almak için, günlüğe daha fazla veri yazması için verileri değiştirmesi gerekir.