क्या हमेशा लेन-देन करना एक बुरा व्यवहार है?


88

क्या हमेशा लेन-देन करना एक बुरा व्यवहार है?

उदाहरण के लिए, एक सरल के अलावा कुछ के लिए लेनदेन बनाने के लिए यह एक अच्छा अभ्यास है SELECT?

जब वास्तव में यह आवश्यक नहीं है तो लेन-देन बनाने की लागत क्या है?

यहां तक ​​कि अगर आप एक अलगाव स्तर का उपयोग कर रहे हैं READ UNCOMMITTED, तो क्या यह एक बुरा अभ्यास है?


1
BEGIN TRAN SELECT ... COMMITबनाम बस के प्रभाव को देखते हुए SELECTएक बहुत ही मामूली प्रदर्शन अंतर प्रतीत होता है ।
मार्टिन स्मिथ

जवाबों:


100

क्या हमेशा एक लेनदेन बनाने के लिए एक बुरा अभ्यास है?

यह इस बात पर निर्भर करता है कि आप यहां किस संदर्भ में बात कर रहे हैं। यदि यह एक अद्यतन है, तो मैं अत्यधिक स्पष्ट रूप से लेनदेन का उपयोग करने की सलाह दूंगा। यदि यह एक सेलेक्ट है तो 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 का धन्यवाद।


35

SQL स्टेटमेंट हमेशा ट्रांजेक्शन में चलता है। यदि आप एक स्पष्ट रूप से शुरू नहीं करते हैं, तो प्रत्येक SQL कथन स्वयं के लेन-देन में चलेगा।

एकमात्र विकल्प यह है कि क्या आप एक लेन-देन में कई कथन बंडल करते हैं। एक से अधिक कथन वाले लेन-देन उन ताले को छोड़ देते हैं जो संगामिति को चोट पहुंचाते हैं। इसलिए "हमेशा" लेनदेन करना एक अच्छा विचार नहीं है। आपको लाभ के खिलाफ लागत को संतुलित करना चाहिए।


1

मुद्दा यह है कि क्या संचालन के एक समूह को एक कार्रवाई के रूप में माना जाना चाहिए। दूसरे शब्दों में, सभी कार्यों को सफलतापूर्वक पूरा किया जाना चाहिए और किसी भी संचालन के लिए प्रतिबद्ध नहीं किया जा सकता है। यदि आपके पास एक ऐसा परिदृश्य है जिसके लिए आपको प्रारंभिक डेटा पढ़ने और फिर उस डेटा के आधार पर अपडेट करने की आवश्यकता होती है, तो प्रारंभिक रीड संभवतः लेनदेन का हिस्सा होना चाहिए। नोट: मैं उद्देश्य पर सेलेक्ट / इन्सर्ट / अपडेट से बच रहा हूँ। लेनदेन का दायरा वास्तव में अनुप्रयोग स्तर पर हो सकता है और इसमें कई डेटाबेस (संक्रियाएँ) शामिल होते हैं। क्लासिक्स पैटर्न जैसे कि एरोप्लेन सीट रिजर्वेशन या बैंक बैलेंस क्वेरी / विदड्रॉल के बारे में सोचें। पूरे अनुप्रयोग की पैदावार को विश्वसनीय, सुसंगत डेटा सुनिश्चित करने के लिए समस्या का एक व्यापक दृष्टिकोण रखना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.