2012-03-23 16 views
6

के तहत MySQL में एक प्रेत बनाने की कोशिश कर रहा है, मैं जेडीबीसी के उपयोग के माध्यम से MySQL में एक प्रेत पढ़ने का प्रयास कर रहा हूं। मैं समझता हूं कि दोहराव-पढ़ा अलगाव स्तर के तहत, प्रेत संभव होना चाहिए। लेकिन मैं एक होने के लिए नहीं मिल सकता है। मेरे लेनदेन स्थापित कर रहे हैं इस प्रकार है:RESATABABLE-READ अलगाव स्तर

लेनदेन 1:

querySetOne[0] = "use adventureworks"; 
querySetOne[1] = "select * from vendorcontact where ContactTypeID between 10 and 30"; 
querySetOne[2] = "select sleep(20)"; 
querySetOne[3] = "select * from vendorcontact where ContactTypeID between 10 and 30"; 
querySetOne[4] = "COMMIT"; 

लेनदेन 2:

querySetTwo[0] = "use adventureworks"; 
querySetTwo[1] = "select sleep(2)"; 
querySetTwo[2] = "insert into vendorcontact values (105, 700, 20, NULL)"; 
querySetTwo[3] = "COMMIT"; 

मैं उन्हें सरणियों में है ख/ग मैं Statement.execute उपयोग कर रहा हूँ() प्रत्येक पंक्ति को निष्पादित करने के लिए विधि और मेरे पास autocommit गलत पर सेट है।

क्वेरीसेट से पूछताछ क्यों करें [1] और क्वेरीसेटऑन [3] दोहराए जाने योग्य पढ़ने अलगाव स्तर के तहत समान परिणाम लौटाते हैं ??

+0

इस सवाल पढ़ें: [? प्रेत निर्माण करने के लिए कैसे पढ़ता] (http://stackoverflow.com/questions/5444915/how-to-produce-phantom-reads) –

उत्तर

0

दोहराए गए पढ़ने के साथ प्रेत संभव नहीं हैं। प्रेत को पढ़ने के परिणामस्वरूप प्रेत हैं। आरआर और आरसी के बीच यह मुख्य अंतर है। मैंने हाल ही में दो अलगाव स्तरों को समझाते हुए एक ब्लॉग पोस्ट लिखा है, क्योंकि वे अक्सर भ्रमित होते हैं: http://blog.9minutesnooze.com/repeatable-read-read-committed/

+0

ठीक है, मैं डेटाबेस इंजन पर स्विच कर लें MyISAM के लिए। अब सभी अलगाव स्तर एक प्रेत उत्पन्न कर सकते हैं (और करते हैं) माईसैम में प्रैक्टिज़ेबल अलगाव स्तर का उत्पादन क्यों होता है, क्या इसे अभी तक दूसरे कार्यकाल तक दूसरे लेनदेन को अवरुद्ध नहीं करना चाहिए ?? – user1251858

+0

माईसाम एक ट्रांजैक्शनल स्टोरेज इंजन नहीं है, इसलिए अनुमोदित पढ़ें/पढ़ें/आदि का कोई प्रभाव नहीं है। डिफ़ॉल्ट रूप से MySQL के साथ शिप करने वाले इंजनों से, आपको इनो डीबी का उपयोग करना होगा। –

3

एसक्यूएल मानक यह इंगित करता है कि दोहराने योग्य पढ़ने अलगाव में प्रेत पढ़ना संभव है, लेकिन यह नहीं कहता कि उन्हें आवश्यक है।

विशेष रूप से, MySQL के InnoDB इंजन repeatable पढ़ने अलगाव, जिसका अर्थ है एक सौदे में पहली पढ़ने एक स्नैपशॉट बनाता है और बाद में लेन-देन में फिर से पढ़ने ही स्नैपशॉट का उपयोग करता है के तहत consistent reads का समर्थन करता है।

MySQL documentation का कहना है इस बारे में repeatable पढ़ने अलगाव:

सभी संगत ही लेन-देन के भीतर पढ़ता स्नैपशॉट पहले पढ़ने द्वारा स्थापित पढ़ें। इस सम्मेलन का अर्थ है कि यदि आप एक ही लेनदेन के भीतर कई सादे (नॉनलॉकिंग) चयन विवरण जारी करते हैं, तो ये चयन विवरण एक-दूसरे के संबंध में भी सुसंगत हैं।

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