MySQL

2010-08-17 3 views
5

के साथ रेल में चयन-लॉकिंग एक सर्वोत्तम अभ्यास सलाह की तलाश में:MySQL

मान लीजिए कि मेरे पास सीमा विशेषता वाला खाता ऑब्जेक्ट है। प्रत्येक दिन खाता भुगतान तक उनकी रकम के साथ एन भुगतान हो सकता है। नया भुगतान करते समय, यह देखने के लिए जांच करता है कि क्या यह राशि है + दिन के अन्य भुगतान की मात्रा अभी भी खाता सीमा के भीतर है, और या तो रिकॉर्ड या डिस्प्ले त्रुटि को बचाती है।

अब मान लीजिए कि मेरे पास 100 डॉलर की सीमा है, और साथ ही 99 डॉलर के दो भुगतान किए जा रहे हैं। प्रत्येक एक चयन करेगा, देखें कि कुछ भी नहीं है, और खुद को बचाने के लिए आगे बढ़ें, जिसके परिणामस्वरूप 198 $ कुल बचाया जा रहा है।

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

उत्तर

3

मैं लेन-देन के शुरू में भुगतान मेज पर एक लिखने ताला जारी करने के बारे में सोच रहा था, लेकिन वह eheavy हाथ छोड़ने लगता है

मान लीजिए कि आप पहले ही लेनदेन के बारे में बात कर रहे हैं, मुझे लगता है कि आप इसका उपयोग नहीं कर रहे हैं MyISAM, लेकिन इसके बजाय InnoDB या कुछ अन्य इंजन जो लेनदेन का समर्थन करता है।

संचालन की परमाणुता को बचाने के लिए लेनदेन पर पढ़ने या लिखने के लिए लॉक करना कुछ ऐसा नहीं है जो मैन्युअल रूप से किया जाना चाहिए। ऐसा करने के लिए यह आपके लेनदेन के अलगाव स्तर का काम है। यह लेनदेन के उद्घाटन और आपकी तालिका या अभिलेखों को लॉक करने के बीच संचालन की परमाणु को भी संरक्षित रखेगा, ताकि इस बीच में कोई भी पर्ची न हो।

उपयोग के मामले के लिए आप जो वर्णन करते हैं, उसके लिए 'सरलीज़ेबल' अलगाव स्तर के साथ लेनदेन होते हैं, जो पढ़ने और लिखने के लिए लॉक हो जाएंगे। साथ ही, यह केवल उन रिकॉर्ड्स को लॉक कर देगा जिन्हें आपने पढ़ा है (भले ही आप श्रेणियों के लिए पूछें), इसलिए शेष रिकॉर्ड्स को हेरफेर के लिए छोड़ दें।

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

आप यहाँ अलगाव के स्तर के बारे में अधिक पढ़ सकते हैं: http://en.wikipedia.org/wiki/Isolation_(database_systems) http://www.databasejournal.com/features/mysql/article.php/3393161/MySQL-Transactions-Part-II---Transaction-Isolation-Levels.htm

आप सीख सकते हैं कि कैसे करने के लिए सेटअप अपने लेनदेन के अलगाव के स्तर का यहाँ: http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html

+0

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