2012-04-06 8 views
8

मैं MySQL सर्वर 5.5 के साथ इस की कोशिश की:MySQL repeatable पढ़ने और खो अद्यतन/प्रेत पढ़ता

1) यह सुनिश्चित किया कि लेन-देन अलगाव स्तर repeatable_read है

2) खोल -1 शुरू कर दिया, उस में कोई लेन-देन शुरू कर दिया, तो,

3) शुरू कर दिया खोल -2 का चयन

के माध्यम से एक मूल्य को पढ़ने के उस में एक लेन-देन शुरू कर दिया है, तो +1 और प्रतिबद्ध मूल्य का चयन

4) खोल -1 में के माध्यम से एक ही मूल्य, मूल्य अद्यतन पढ़

5) खोल -2 में, मूल्य अद्यतन मूल्य + 1 और प्रतिबद्ध

मूल्य इसकी अद्यतन में से एक खो दिया है और अब से 1.

केवल वृद्धि की गई थी, के रूप में मैं इसे, आर आर का उपयोग करता है को समझने साझा पढ़े गए ताले और अनन्य लेखन ताले, जिसका अर्थ है कि ऊपर # 4 और # 5 में, लेनदेन को मृत-बंद होना चाहिए था, लेकिन ऐसा नहीं हुआ।

तो या तो आरआर की मेरी समझ दोषपूर्ण है, या MySQL आरआर को एक अलग तरीके से लागू करता है। तो यह क्या है?

संपादित करें: इसी तरह के प्रयोग के माध्यम से, यह भी पुष्टि की गई कि एक आरआर लेनदेन (टी 1) एक ही तालिका में अन्य आरआर लेनदेन (टी 2) द्वारा पंक्तियों में डाली गई पंक्तियों को नहीं देखता है, अगर यह टी 2 के बाद भी उस तालिका पर दूसरा चयन करता है और टी 1 करने से पहले। (यहां इस प्रयोग का लिंक दिया गया है: http://www.databasejournal.com/features/mysql/article.php/3393161/MySQL-Transactions-Part-II---Transaction-Isolation-Levels.htm)

क्या इसका मतलब यह है कि MySQL का आरआर प्रेत का ख्याल रखता है?

+0

आप serializable लेनदेन की कोशिश की? http://dev.mysql.com/doc/refman/5.1/en/set-transaction.html#isolevel_serializable – biziclop

+0

हां, और ऐसा लगता है कि MySQL serializable साझा पठन ताले और विशेष लेखन ताले का उपयोग करता है, और इसलिए इसमें एक डेडलॉक देता है उपरोक्त मामले में तो मैं वास्तव में उलझन में हूं, क्योंकि यहां 'जेब विद हाइबरनेट' पुस्तक कहती है: "दोहराने योग्य पढ़ने के अलगाव मोड में चल रही एक प्रणाली न तो अपरिवर्तनीय पढ़ती है और न ही गंदे पढ़ती है। प्रेत पढ़ता है। लेनदेन पढ़ना ब्लॉक लेखन लेनदेन (लेकिन नहीं अन्य पढ़ने के लेनदेन), और लेखन लेनदेन अन्य सभी लेनदेन को अवरुद्ध करते हैं। " (पेज 456) – shrini1000

उत्तर

6

MySQL वास्तव में दोहराने योग्य पढ़ने के अनुरूप नहीं है। आप इसे अलगाव स्तर क्रमबद्ध करने या अपने चयन के बाद एक अद्यतन अद्यतन करके (नीचे दिए गए उदाहरण को देखें) का उपयोग करके इसे करने के लिए मजबूर कर सकते हैं। फिर वांछित व्यवहार हासिल किया जाएगा। के बारे में प्रेत पढ़ता है, MySQL वास्तव में आवश्यकता से सख्त है ...

SELECT value FROM table WHERE id = 7 FOR UPDATE; 
+0

thx! क्या आप पीएल कर सकते हैं इसके लिए एक संदर्भ उद्धृत करें ताकि मैं इसे एक उत्तर के रूप में स्वीकार कर सकूं? – shrini1000

+4

http://www.cs.umb.edu/~poneil/iso.pdf कहता है कि दोहराने वाले अपडेट दोहराने योग्य पढ़ने में संभव नहीं हैं। आप अंतिम पृष्ठ पर सारांश और मध्य में कहीं उस विशिष्ट विसंगति पर चर्चा पा सकते हैं (बस "खोए गए अपडेट" की खोज करें)। मैं आपको अधिक संदर्भ नहीं दे सकता, मुझे आशा है कि यह अभी के लिए पर्याप्त है। – Argeman

+0

बस यह सुनिश्चित करने के लिए: खोए गए अपडेट वास्तव में संभव हैं जब इन गैर-अनुरूप कार्यान्वयन के कारण पुनरावर्तनीय पढ़ने के साथ इनो डीबी का उपयोग करना संभव हो। क्या वह सही है? – Basti