1 টি বোঝা সঠিক। এসকিউএল সার্ভার প্রতিটি ক্রিয়াকলাপ রেকর্ড করে যা লেনদেন লগে ডেটা পরিবর্তন করে। একটি রোলব্যাক ডেটাতে পরিবর্তন যা এটি লেনদেনের লগেও এটি রেকর্ড করে। স্টেটমেন্ট এ রান হিসাবে এটি লেনদেনের লগে ডেটা লিখবে এবং বিবৃতিতে এটিকে আবার ঘুরিয়ে দেওয়ার প্রয়োজনে লেনদেনের লগে ডেটা সংরক্ষণ করবে। বি এবং সি এর ক্ষেত্রেও এটি সত্য When আপনি যখন লেনদেনটি রোলব্যাক করবেন তখন আরও তথ্য লগতে লেখা হবে।
এটিকে কর্মে দেখার জন্য প্রচুর উপায় রয়েছে তাই নীচে একটি দ্রুত ডেমো রয়েছে। লগতে কী লেখা হয়েছিল তা দেখার জন্য আমি এখানে এমন ক্যোয়ারী দিচ্ছি:
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
ক্যোয়ারি এ ন্যূনতম লগিং ব্যবহার করে:
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 ║
╚═══════════════════╩════════════╩════════════════╝
প্রশ্ন বি ন্যূনতম লগিং ব্যবহার করে না:
INSERT INTO TLOGDEMO
SELECT REPLICATE('B', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
খ পরে:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7352935708 ║ 1613986255 ║
╚═══════════════════╩════════════╩════════════════╝
ক্যোরি সি কম ডেটা পরিবর্তন করে:
INSERT INTO TLOGDEMO
SELECT REPLICATE('C', 1000)
FROM master..spt_values c;
সি এর পরে:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7355821748 ║ 1614545331 ║
╚═══════════════════╩════════════╩════════════════╝
এখন আমি একটি জারি করব ROLLBACKএবং রোলব্যাকটি হওয়ার সময় ডিএমভিকে জিজ্ঞাসা করব । নীচে কয়েকটি স্ন্যাপশটের একটি টেবিল দেওয়া হল:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7393305528 ║ 1573797677 ║
║ 1 ║ 7458767420 ║ 1502635737 ║
║ 1 ║ 7682482356 ║ 1259440979 ║
║ 1 ║ 7803881368 ║ 1127471233 ║
║ ... ║ ... ║ ... ║
╚═══════════════════╩════════════╩════════════════╝
চলাকালীন ROLLBACK, ব্যবহৃত বাইটগুলি বৃদ্ধি পায় এবং বাইটগুলির সংরক্ষিত সংখ্যা হ্রাস পায়। কারণ এসকিউএল সার্ভার লেনদেন পূর্বাবস্থায় ফেলার পূর্বে আলাদা করা স্থানটি ব্যবহার করছে। লেনদেনটি পূর্বাবস্থায় ফেলার জন্য এটি অবশ্যই ডেটা পরিবর্তন করতে হবে যাতে এটি লগতে আরও ডেটা লেখে।