1 को समझना सही है। SQL सर्वर डेटा को ट्रांजेक्शन लॉग में बदलने वाले हर ऑपरेशन को रिकॉर्ड करता है। रोलबैक डेटा में परिवर्तन है, इसलिए यह लेनदेन लॉग के लिए भी रिकॉर्ड करता है। स्टेटमेंट ए रन के रूप में यह ट्रांजेक्शन लॉग में डेटा लिखेगा और ट्रांजैक्शन लॉग में डेटा भी रखेगा। ए स्टेट स्टेटमेंट में बैक रोल करने की जरूरत है। बी और सी के लिए भी यही सच है। जब आप लेन-देन करते हैं तो लॉग में अधिक जानकारी लिखी जाएगी।
कार्रवाई में इसे देखने के बहुत सारे तरीके हैं इसलिए नीचे एक त्वरित डेमो है। यहाँ वह प्रश्न है जिसका उपयोग मैं यह देखने के लिए करूँगा कि लॉग में क्या लिखा गया था:
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 ║
╚═══════════════════╩════════════╩════════════════╝
क्वेरी C कम डेटा बदलता है:
INSERT INTO TLOGDEMO
SELECT REPLICATE('C', 1000)
FROM master..spt_values c;
सी के बाद:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7355821748 ║ 1614545331 ║
╚═══════════════════╩════════════╩════════════════╝
अब मैं ROLLBACKDMV जारी करूंगा और रोलबैक होने के दौरान DMV को क्वेरी करूँगा । नीचे कुछ स्नैपशॉट की तालिका दी गई है:
╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1 ║ 7393305528 ║ 1573797677 ║
║ 1 ║ 7458767420 ║ 1502635737 ║
║ 1 ║ 7682482356 ║ 1259440979 ║
║ 1 ║ 7803881368 ║ 1127471233 ║
║ ... ║ ... ║ ... ║
╚═══════════════════╩════════════╩════════════════╝
के दौरान ROLLBACK, प्रयुक्त बाइट्स बढ़ जाती हैं और बाइट्स की आरक्षित संख्या घट जाती है। ऐसा इसलिए है क्योंकि SQL सर्वर उस स्थान का उपयोग कर रहा है जो लेन-देन को पूर्ववत करने से पहले सेट किया गया है। लेन-देन को पूर्ववत करने के लिए इसे डेटा बदलना होगा ताकि यह लॉग में अधिक डेटा लिख सके।