Memahami 1 benar. SQL Server mencatat setiap operasi yang mengubah data ke log transaksi. Kembalikan adalah perubahan data sehingga juga mencatat itu ke log transaksi juga. Sebagai pernyataan A jalankan itu akan menulis data ke log transaksi dan juga akan memesan data dalam log transaksi jika pernyataan A perlu digulirkan kembali. Hal yang sama berlaku untuk B dan C. Ketika Anda mengembalikan transaksi, informasi lebih lanjut akan ditulis ke log.
Ada banyak cara untuk melihat ini dalam aksi jadi di bawah ini adalah demo cepat. Berikut adalah kueri yang akan saya gunakan untuk melihat apa yang ditulis ke log:
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;
Meja saya:
create table TLOGDEMO (FLUFF VARCHAR(1000));
BEGIN TRANSACTION
Kueri A menggunakan pencatatan minimum:
INSERT INTO TLOGDEMO WITH (TABLOCK)
SELECT REPLICATE('A', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Setelah:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 24006640 ║ 175429451 ║
╚═══════════════════╩════════════╩════════════════╝
Kueri B tidak menggunakan pencatatan minimum:
INSERT INTO TLOGDEMO
SELECT REPLICATE('B', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Setelah B:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7352935708 ║ 1613986255 ║
╚═══════════════════╩════════════╩════════════════╝
Kueri C mengubah lebih sedikit data:
INSERT INTO TLOGDEMO
SELECT REPLICATE('C', 1000)
FROM master..spt_values c;
Setelah C:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7355821748 ║ 1614545331 ║
╚═══════════════════╩════════════╩════════════════╝
Sekarang saya akan mengeluarkan ROLLBACKdan meminta DMV sementara rollback terjadi. Di bawah ini adalah tabel dari beberapa foto:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7393305528 ║ 1573797677 ║
║ 1 ║ 7458767420 ║ 1502635737 ║
║ 1 ║ 7682482356 ║ 1259440979 ║
║ 1 ║ 7803881368 ║ 1127471233 ║
║ ... ║ ... ║ ... ║
╚═══════════════════╩════════════╩════════════════╝
Selama ROLLBACK, byte yang digunakan meningkat dan jumlah byte yang dipesan berkurang. Itu karena SQL Server menggunakan ruang yang disisihkan sebelumnya untuk membatalkan transaksi. Untuk membatalkan transaksi itu harus mengubah data sehingga menulis lebih banyak data ke log.