ความเข้าใจที่ 1นั้นถูกต้อง SQL Server บันทึกทุกการดำเนินการที่เปลี่ยนแปลงข้อมูลไปยังบันทึกธุรกรรม การย้อนกลับเป็นการเปลี่ยนแปลงข้อมูลดังนั้นจึงเป็นการบันทึกลงในบันทึกธุรกรรมเช่นกัน ในฐานะที่เป็นรันคำสั่งมันจะเขียนข้อมูลไปยังบันทึกการทำธุรกรรมและจะสำรองข้อมูลในบันทึกการทำธุรกรรมในกรณีที่คำสั่ง 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;
หลังจาก:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 24006640 ║ 175429451 ║
╚═══════════════════╩════════════╩════════════════╝
Query 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 ║
╚═══════════════════╩════════════╩════════════════╝
Query 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 ใช้พื้นที่ที่ตั้งไว้ก่อนที่จะเลิกทำธุรกรรม ในการเลิกทำธุรกรรมนั้นจะต้องเปลี่ยนข้อมูลเพื่อที่จะเขียนข้อมูลเพิ่มเติมลงในบันทึก