क्या हमेशा एक लेनदेन बनाने के लिए एक बुरा अभ्यास है?
यह इस बात पर निर्भर करता है कि आप यहां किस संदर्भ में बात कर रहे हैं। यदि यह एक अद्यतन है, तो मैं अत्यधिक स्पष्ट रूप से लेनदेन का उपयोग करने की सलाह दूंगा। यदि यह एक सेलेक्ट है तो NO (स्पष्ट रूप से)।
लेकिन प्रतीक्षा करें पहले समझने के लिए और अधिक है: एसक्यूएल सर्वर में सब कुछ एक लेनदेन में निहित है।
जब सत्र विकल्प होता IMPLICIT_TRANSACTIONS
है OFF
और आप स्पष्ट रूप से निर्दिष्ट करते हैं begin tran
और commit/rollback
तब इसे आमतौर पर स्पष्ट लेनदेन के रूप में जाना जाता है । अन्यथा आपको ऑटोकॉमिट ट्रांजेक्शन मिलता है।
जब IMPLICIT_TRANSACTIONS
है ON
एक अंतर्निहित लेनदेन जब बयान प्रकार किताबें ऑनलाइन लेख (जैसे में दस्तावेज में से एक को क्रियान्वित करने के लिए स्वचालित रूप शुरू कर दिया है SELECT
/ UPDATE
/ CREATE
) और यह प्रतिबद्ध या स्पष्ट रूप से वापस लुढ़का किया जाना चाहिए। BEGIN TRAN
इस मोड में एक वृद्धि बढ़ जाएगी @@TRANCOUNT
और एक और "नेस्टेड" लेनदेन शुरू होगा )
आप किस मोड में हैं, इसे बदलने के लिए आप उपयोग करेंगे
SET IMPLICIT_TRANSACTIONS ON
या
SET IMPLICIT_TRANSACTIONS OFF
select @@OPTIONS & 2
यदि ऊपर 2 रिटर्न, आप अंतर्निहित लेनदेन मोड में हैं। यदि यह 0 देता है, तो आप ऑटोकॉमिट में हैं।
जब वास्तव में आवश्यक नहीं है तो लेन-देन बनाने की लागत कितनी है?
एक सुसंगत अवस्था से डेटाबेस को दूसरे सुसंगत अवस्था में ले जाने के लिए लेन-देन की आवश्यकता होती है। लेन-देन का कोई विकल्प नहीं है क्योंकि लेनदेन का कोई विकल्प नहीं है। संदर्भ: पंक्ति संस्करण आधारित अलगाव स्तरों का उपयोग करना
भले ही आप एक आइसोलेशन स्तर read_uncomitted का उपयोग कर रहे हों। एक बुरा अभ्यास है? क्योंकि इसमें लॉकिंग की समस्या नहीं होनी चाहिए।
READ_UNCOMMITED अलगाव स्तर परिभाषा द्वारा गंदे रीड्स की अनुमति देगा अर्थात एक लेन-देन अन्य लेन-देन के बिना किए गए परिवर्तनों को देखने में सक्षम होगा। यह आइसोलेशन लेवल क्या है, यह लॉकिंग के ओवर हेड को रिलैक्स करता है - डेटाबेस कंसीडर को सुरक्षित रखने के लिए लॉक प्राप्त करने का तरीका।
आप इसे कनेक्शन / क्वेरी स्तर पर उपयोग कर सकते हैं, ताकि यह अन्य प्रश्नों को प्रभावित न करे।
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
जेफ एटवुड द्वारा डाइनिंग फिलॉसॉफर्स पहेली के कारण डेडलॉक का वर्णन करने और पढ़ने के लिए प्रतिबद्ध स्नैपशॉट अलगाव स्तर का वर्णन करके एक दिलचस्प लेख मिला ।
संपादित करें:
जिज्ञासा से बाहर, मैंने कुछ टेस्ट टेस्ट किए, जो लॉग बाइट्स फ्लश / सेक, लॉग फ्लश वेट / सेक जैसे परफेक्ट काउंटरों के साथ टी-लॉग पर पड़ने वाले प्रभाव को मापते हैं। प्रति सेकंड के कमिट्स (प्रति सेकंड जो लॉग फ्लश होने की प्रतीक्षा कर रहे हैं) ग्राफ के नीचे:
नमूना कोड :
create table testTran (id int, Name varchar(8))
go
-- 19 sec
-- Autocommit transaction
declare @i int
set @i = 0
while @i < 100000
begin
insert into testTran values (1,'Kin Shah')
set @i = @i+1
end
---------------------------------------------------
-- 2 sec
-- Implicit transaction
SET IMPLICIT_TRANSACTIONS ON
declare @i int
set @i = 0
while @i < 100000
begin
insert into testTran values (1,'Kin Shah')
set @i = @i+1
end
COMMIT;
SET IMPLICIT_TRANSACTIONS OFF
----------------------------------------------------
-- 2 sec
-- Explicit transaction
declare @i int
set @i = 0
BEGIN TRAN
WHILE @i < 100000
Begin
INSERT INTO testTran values (1,'Kin Shah')
set @i = @i+1
End
COMMIT TRAN
स्वतः पूर्णता लेनदेन : (@TravisGan द्वारा हाइलाइट किया गया)
- इन्सर्ट ने 19 सेकेंड लिए।
- प्रत्येक ऑटोकॉमिट डिस्क पर टी-लॉग बफर को ऑटोकॉमिट के कारण फ्लश करेगा (@TravisGan हाइलाइट होने के बाद, और मुझे याद है कि उल्लेख करना है)।
- CHECKPOINT प्रक्रिया तेजी से पूरी हो जाएगी क्योंकि फ्लश किए जाने के लिए आवश्यक गंदा लॉग बफर की मात्रा कम होगी क्योंकि यह अक्सर शांत चलता है।
महत्वपूर्ण और स्पष्ट लेन-देन:
- इंसर्ट ने 2 सेकेंड लिए।
- EXPLICIT लेन-देन के लिए, लॉग बफ़र्स केवल तभी भरे जाएंगे जब वे भरे हुए हों।
- ऑटोकॉमिट लेनदेन के विपरीत, EXPLICIT लेनदेन में, CHECKPOINT प्रक्रिया में अधिक समय लगेगा क्योंकि इसमें फ्लश करने के लिए अधिक लॉग बफ़र्स होंगे (याद रखें कि लॉग बफ़र्स केवल तभी भरे जाते हैं जब वे भरे होते हैं)।
एक DMV sysinos_tran_database_transactions है जो डेटाबेस स्तर पर लेनदेन के बारे में जानकारी लौटाएगा।
जाहिर है, यह प्रभाव दिखाने के लिए एक सरलीकृत परीक्षण का अधिक प्रकार है। अन्य कारक जैसे डिस्क सबसिस्टम, डेटाबेस ऑटो ग्रोथ सेटिंग्स, डेटाबेस का प्रारंभिक आकार, एक ही सर्वर \ डेटाबेस पर चलने वाली अन्य प्रक्रियाएं, आदि पर भी प्रभाव पड़ेगा।
उपरोक्त परीक्षणों से, Implicit & Explicit लेनदेन के बीच कोई अंतर नहीं है।
उत्तर में और जोड़ने के लिए मदद करने के लिए @TravisGan का धन्यवाद।
BEGIN TRAN SELECT ... COMMIT
बनाम बस के प्रभाव को देखते हुएSELECT
एक बहुत ही मामूली प्रदर्शन अंतर प्रतीत होता है ।