2012-03-22 18 views
16

मैंने अक्सर देखा कि कई लोग लेनदेन के भीतर SELECT कथन का उपयोग करते हैं। मैं अक्सर लेनदेन में insert/update/delete का उपयोग करता हूं। मैं समझ में नहीं आता कि लेनदेन के अंदर SELECT कथन डालने की उपयोगिता क्या है।एसक्यूएल सर्वर लेनदेन और चयन कथन

मैं एक ही जवाब मिला कि .... SELECT लेनदेन है कि सौदे में अन्य पिछले Insert/Update/Delete बयानों द्वारा किए गए लेन-देन के बाहर एक SELECT बयान नहीं कर सकते परिवर्तन देख सकते हैं अंदर।

ऊपर कथन यह सच है या नहीं?

क्या यह एकमात्र कारण है कि लोग लेनदेन के अंदर SELECT कथन डालते हैं? यदि संभव हो तो सभी कारणों से विस्तार से चर्चा करें। धन्यवाद

+1

यदि आप डिफ़ॉल्ट अलगाव स्तर ('पढ़ा गया पढ़ा गया ') का उपयोग कर रहे हैं - तो हाँ - लेनदेन के बाहर एक' चयन '** ** ** लेनदेन के किसी भी सम्मिलन या अपडेट को नहीं देखेगा, जब तक वे वास्तव में नहीं हैं प्रतिबद्ध। –

उत्तर

16

ऐसा करने का प्रयास करें और आप समझ जायेंगे: (यह ए और बी अब एक से फोन की सुविधा देता है) और एक पर, इस तरह एक साधारण तालिका बनाने

ओपन पर SSMS एक दो नए प्रश्नों :

उन दोनों में select * from transTest कार्य करें:

create table transTest(id int) 
insert into transTest values(1) 

अब, निम्न कार्य करें।आप मान 1

देखेंगे एक रन पर:

set transaction isolation level read committed 

बी रन पर:

begin transaction 
insert into transTest values(2) 

एक रन पर:

select * from transTest

आपको लगता है कि देखेंगे क्वेरी खत्म नहीं होगी क्योंकि यह लेनदेन द्वारा लॉक किया गया है

बी रन पर:

commit transaction 

एक पर वापस जाएं और आप देखेंगे कि क्वेरी एक पर set transaction isolation level read uncommitted के साथ समाप्त

दोहराएँ परीक्षण आपको लगता है कि क्वेरी अभ्यस्त द्वारा बंद किया जा देखेंगे लेनदेन

+0

उत्तर के लिए धन्यवाद। क्या आप मुझे बता सकते हैं कि "अलगाव स्तर पढ़ा गया" क्या है? इसका अर्थ यह है कि "अलगाव स्तर पढ़ा गया है" आपके स्पष्टीकरण के अनुसार यह टेबल लॉक होगा लेकिन मैं केवल पंक्ति को लॉक करना चाहता हूं। तो मुझे मार्गदर्शन करो। धन्यवाद – Thomas

+0

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

5

मुख्य कारण मैं के बारे में सोच सकते हैं में से एक (एकमात्र कारण है, वास्तव में) है आप एक अलग isolation level, जैसे सेट करना चाहते हैं:

USE AdventureWorks2008R2; 
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
BEGIN TRANSACTION; 

SELECT * FROM HumanResources.EmployeePayHistory; 

SELECT * FROM HumanResources.Department; 

COMMIT TRANSACTION; 

एकल SELECT स्टेटमेंट्स के लिए हालांकि, मैं कर रहा हूँ इतना निश्चित नहीं है, जब तक कि आपके पास दूसरी तरफ जाने का कारण न हो और उन मामलों में संयुक्त रूप से पढ़ा जाए जहां प्रतिक्रिया समय/अधिकतम समेकन सटीक या मान्य डेटा से अधिक महत्वपूर्ण है।

< अटकलें निश्चितता = "75%" > एकल SELECT कथन अलगाव के स्तर को बदले बिना एक स्पष्ट लेन-देन के अंदर है, तो मैं बहुत यकीन है कि सब पर कोई असर नहीं होगा हूँ। व्यक्तिगत विवरण स्वयं, लेन-देन होते हैं जो स्वत: प्रतिबद्ध होते हैं या त्रुटि पर वापस लुढ़कते हैं। </अटकलें >

संबंधित मुद्दे