2012-09-11 15 views
6

मैं काम पर कुछ सपा डबिंग रहा हूँ और मैं की खोज की है कि जो कोई भी लिखा कोड इसएक भी अद्यतन बयान

begin transaction 
*single update statment:* update table whatever with whatever 
commit transaction 

मैं समझता हूँ की तरह एक भी अद्यतन बयान पर लेन-देन के लिए इस्तेमाल किया है कि इस वजह से गलत है पर लेन-देन का उपयोग करना जब आप एकाधिक अपडेट अपडेट करना चाहते हैं तो लेनदेन का उपयोग किया जाता है। मैं सैद्धांतिक बिंदु से समझना चाहता हूं, ऊपर दिए गए कोड का उपयोग करने के प्रभाव क्या हैं? क्या लेन-देन के साथ और बिना किसी भी तालिका को अपडेट करने में कोई अंतर है? क्या कोई अतिरिक्त ताले या कुछ है?

+1

यह एक ही कथन के साथ एक लेनदेन है। शायद मूल डेवलपर ने सोचा कि भविष्य में अतिरिक्त बयान/कार्रवाई की आवश्यकता हो सकती है। –

उत्तर

5

शायद लेन-देन पूर्व या संभावित भविष्य के कोड है जो अन्य डेटा शामिल हो सकता है की वजह से शामिल किया गया था: और सिर्फ 2 पंक्तियाँ - यह केवल एक मेज शामिल है। शायद डेवलपर बस 'सुरक्षित' होने के लिए लेनदेन में कोड लपेटने की आदत बनाता है?

लेकिन यदि कथन में सचमुच एक पंक्ति में केवल एक ही अपडेट शामिल है, तो इस मामले में उस कोड के लिए वास्तव में कोई लाभ नहीं है। एक लेनदेन जरूरी नहीं है कि कुछ भी 'लॉक' हो, हालांकि इसके अंदर किए गए कार्यों में, निश्चित रूप से हो सकता है। यह सिर्फ यह सुनिश्चित करता है कि इसमें निहित सभी कार्य सभी या कुछ भी नहीं किए जाते हैं।

ध्यान दें कि एक लेनदेन एकाधिक तालिकाओं के बारे में नहीं है - यह लगभग अद्यतन है। यह सुनिश्चित करना कि एकाधिक अपडेट सभी-या-कोई नहीं होते हैं।

तो यदि आप एक ही तालिका दो बार अपडेट कर रहे थे, तो लेनदेन के साथ या उसके बिना कोई अंतर आएगा। लेकिन आपका उदाहरण केवल एक ही अपडेट स्टेटमेंट दिखाता है, संभवतः केवल एक रिकॉर्ड को अपडेट करता है।

वास्तव में, यह संभवतः बहुत आम है कि लेन-देन एक ही तालिका में एकाधिक अपडेट को समाहित करता है। निम्नलिखित कल्पना कीजिए:

INSERT INTO Transactions (AccountNum, Amount) VALUES (1, 200) 
INSERT INTO Transactions (AccountNum, Amount) values (2, -200) 

एक सौदे में लपेटा जाना चाहिए यही कारण है, आश्वस्त करने के लिए है कि पैसे को सही ढंग से स्थानांतरित कर रहा है। अगर कोई विफल रहता है, तो दूसरा।

+0

सवाल यह है: क्या लेनदेन के साथ और उसके बिना एक अपडेट स्टेटमेंट के बीच कोई अंतर है? – user1662812

+0

@ user1662812 यह बिल्कुल कुछ भी नहीं करता है।सभी एकल कथन पहले ही लेनदेन में प्रभावी रूप से लपेटे गए हैं। मुझे विश्वास नहीं है कि यह एक बाहरी, रैपिंग लेनदेन बनाता है, हालांकि। –

4

मैं समझता हूं कि यह गलत है क्योंकि जब आप एकाधिक तालिकाओं को अपडेट करना चाहते हैं तो लेनदेन का उपयोग किया जाता है।

आवश्यक नहीं है।

--- transaction begin 

BEGIN TRANSACTION ; 

UPDATE tableX 
SET Balance = Balance + 100 
WHERE id = 42 ; 

UPDATE tableX 
SET Balance = Balance - 100 
WHERE id = 73 ; 

COMMIT TRANSACTION ; 

--- transaction end 
3

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

begin transaction -- Increases @@TRANCOUNT to 1 
update table whatever with whatever 
commit transaction -- DECREMENTS @@TRANCOUNT to 0 

अक्सर, जब एसक्यूएल के खिलाफ सीधे सहारा बयान जारी, यह एक अच्छा विचार एक सौदे में अपने बयान रैप करने के लिए है, सिर्फ मामले में कुछ गलत हो जाता है और आप रोलबैक करने के लिए

begin transaction -- Just in case my query goofs up 
update table whatever with whatever 
select ... from table ... -- check that the correct updates/deletes/inserts happened 
-- commit transaction -- Only commit if the above check succeeds. 
की जरूरत है, यानी
संबंधित मुद्दे