2012-02-16 12 views
17

में लेनदेन का उपयोग कब करें लेनदेन का उपयोग करने के लिए बहुत सारे प्रश्न हैं। मैं क्या जानना चाहता हूं WHEN? किस परिस्थिति में? किस प्रकार के प्रश्न? कोशिश कर सकते हैं-बजाय ब्लॉक पर्याप्त पकड़ सकते हैं? आदि ...SQL सर्वर

मैंने ~ 20 टेबल और ~ 20 संग्रहीत प्रक्रियाओं के साथ एक डेटाबेस तैयार किया है। वर्तमान में मेरे एसपी में से कोई भी लेनदेन का उपयोग नहीं करता है, लेकिन पूरे प्रयास में कई प्रयास-कैच ब्लॉक हैं। इसका कारण यह है कि हर बार जब मैंने उन्हें लेन-देन में लपेटने की कोशिश की तो एसपी काम करना बंद कर देगी और मैं ट्रांस का उपयोग करने के बजाय गायब डेटा और बदतर से समाप्त हो जाऊंगा।

तो फिर ...

  1. जब एक उपयुक्त समय कोई लेन-देन का उपयोग है?
  2. एक फॉलो-अप प्रश्न के रूप में, यदि मैं उनका उपयोग करता हूं, तो मैं उन तरीकों से कैसे उपयोग कर सकता हूं जैसे कि अन्य एसपी को एक ही समय में उसी डेटा तक पहुंचने से रोकने के लिए भ्रष्टाचार को रोकने के बजाय मेरे एसपी बिल्कुल काम नहीं करने के लिए?

यह एक छोटा सा नमूना सपा मैं एक उत्पाद का नाम बदलने के लिए लिखा था है:

CREATE PROCEDURE spRenameProduct 
    @pKey int = NULL, 
    @pName varchar(50) 
AS 
BEGIN 
    BEGIN TRY 
     IF LTRIM(RTRIM(@pName)) = '' SET @pName = NULL 
     IF NOT @pKey IS NULL AND NOT @pName IS NULL BEGIN 
      declare @pKeyExisting int = (select MIN(ID) from rProduct where Product like @pName and not ID = @pKey) 
      IF @pKeyExisting is null BEGIN 
       update rProduct set IsValid = 1, Product = @pName where ID = @pKey 
      END ELSE BEGIN 
       update Request set ProductID = @pKeyExisting where ProductID = @pKey 
       update StatusReport set ProductID = @pKeyExisting where ProductID = @pKey 
       delete from rProduct where ID = @pKey 
      END 
     END 
    END TRY BEGIN CATCH END CATCH 
END 

अब क्या हुआ अगर दो लोगों को सटीक एक ही समय में इस का उपयोग कर रहे थे? मैं वास्तव में नहीं चाहता, और न ही मेरे पास समय है (दुर्भाग्य से), फैंसी पाने के लिए। चुम्मा। इस मामले में सबसे अच्छा है। :)

+0

आप लेनदेन के साथ अलगाव स्तर मिश्रण कर रहे हैं। अलगाव के साथ आप उस एकल कथन की अवधि के लिए अन्य अपडेट लॉक कर सकते हैं। यदि आपको या तो आगे बढ़ने या विफल होने के लिए अपडेट का एक सेट चाहिए तो आप उन्हें लेनदेन में लपेटें। यदि आप दो अपडेट चाहते हैं और एक सिंक में रहने के लिए हटाते हैं तो लेनदेन क्या कर सकता है। – Paparazzi

+0

@ बलामबालम तो दूसरे शब्दों में यह केवल दो अपडेट लपेटने और एक लेनदेन में एक हटाने के लिए समझ में आता है, लेकिन हमेशा पूरे एसपी को लपेटने से मुझे लगता है कि मुझे लगता है कि ज्यादा समझ में नहीं आता है? फिर भी, मुझे लगता है कि ट्रांस कभी-कभी काम करने के लिए बहुत बोझिल हो सकता है क्योंकि डेवलपर्स कभी-कभी गलतियां करते हैं। मैं नहीं चाहता कि ऐप सिर्फ एक हानिकारक अपवाद जैसे शून्य संदर्भ या कुछ के कारण असफल हो। ज्ञान के किसी भी शब्द? इस पर अभी भी नया :) – Chiramisu

+0

मुझे नहीं पता कि यह कैसे स्पष्ट है। यदि आपको असफल होने या पूरी तरह सफल होने के लिए सेट की आवश्यकता है तो उसे लेनदेन में लपेटें। क्लासिक उदाहरण चेकिंग से बचत खाते में धन हस्तांतरण होता है - यदि जमा विफल हो जाता है तो मैं वापसी को विफल करना चाहता हूं। यदि डेवलपर गलती के कारण सिंक से डेटा ठीक है तो लेनदेन का उपयोग न करें। – Paparazzi

उत्तर

27

आप लेनदेन का उपयोग करते हैं जब आप डेटाबेस संचालन के सेट को परमाणु होने की आवश्यकता होती है।

यही है - उन्हें सभी को या विफल होने की आवश्यकता है। बीच में कुछ नहीं

लेनदेन का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि डेटाबेस हमेशा एक सतत स्थिति में रहता है।

सामान्य रूप से, जब तक उनका उपयोग न करने का कोई अच्छा कारण नहीं है (उदाहरण के लिए लंबी चल रही प्रक्रिया), उनका उपयोग करें। विवरण के लिए this blog post देखें।


Try/Catch ब्लॉक लेनदेन के साथ कुछ नहीं करना है - वे अपवाद संचालन के लिए उपयोग किया जाता है। दो अवधारणाएं संबंधित नहीं हैं और एक-दूसरे के लिए प्रतिस्थापन नहीं हैं।

+1

+1 और ** नहीं ** - एक 'कोशिश करें ... पकड़ें' ब्लॉक ** ** ** लेनदेन के लिए पर्याप्त प्रतिस्थापन नहीं है .... –

+0

@marc_s - बिल्कुल। इसके बारे में अब एक पैराग्राफ जोड़ा गया है ... – Oded

+0

@ ओडेड जो मैं प्राप्त करने की उम्मीद कर रहा हूं वह कुछ चीजें हैं जिन्हें मैं डेवलपर के रूप में देख सकता हूं जो लेनदेन का उपयोग करने पर विचार करने के लिए मुझे टिप सकता है। उदाहरण के लिए, "हम्म, वहां 'अपडेट' कथन है, शायद मुझे लेनदेन का उपयोग करना चाहिए।" या "यह सिर्फ एक 'चयन' है इसलिए मुझे स्पष्ट रूप से लेनदेन की आवश्यकता नहीं है।" आदि 'हटाने' के बारे में कैसे? बुनियादी सीआरयूडी परिचालन या अन्य जो ट्रांस की आवश्यकता को इंगित कर सकते हैं? – Chiramisu

0

आम जवाब यह है कि लेनदेन डेटाबेस संचालन परमाणु होने की अनुमति देता है। भ्रम का अर्थ यह है कि इसका क्या अर्थ है। यह शामिल विशेष संचालन के बारे में नहीं है कि वे चयन, अद्यतन, हटाएं, आदि हैं। यह डेटा के अर्थपूर्ण अर्थ के बारे में है। संचालन के दृष्टिकोण से, नीचे-नीचे से, हम कहते हैं कि एक समूह के रूप में, वे परमाणु हैं। लेकिन, अमूर्त स्तर से, ऊपर-नीचे से देखकर, हम कहते हैं कि हमारे पास जानकारी का संरक्षण है।

एक आसान उदाहरण होगा यदि आपके पास 2 खाते थे और आप पैसा नहीं बनाना चाहते थे और न ही उनके बीच स्थानांतरण में नष्ट हो गए थे। एक और, अधिक सूक्ष्म उदाहरण, यदि आपके पास डेटा का एक समूह होता है जिसे समूह के रूप में या तो बनाया या नष्ट करने की आवश्यकता होती है। दूसरे शब्दों में, आंशिक जानकारी होने से कोई समझ नहीं आता है। मुझे लगता है कि एक उदाहरण हो सकता है यदि आपके पास कोई उपयोगकर्ता था और हमेशा गारंटी देना चाहता था कि उनके पास पहला और अंतिम नाम था। आंशिक नाम नहीं है।

इसके साथ, लोग परमाणु साधनों को व्यक्त करने के लिए अंगूठे के वाक्यांशों और नियमों के साथ आते हैं, जैसे कि "संचालन को सभी को सफल होने या विफल होने की आवश्यकता होती है"। साथ ही, लोग पैटर्न को नोटिस करते हैं, जैसे कि चयन को लेनदेन की आवश्यकता नहीं होगी।