2009-11-30 15 views
7

मैं तीन क्षेत्रों, मैं, ए और बी के साथ एक mnesia तालिका है में एक भी फ़ील्ड मान अद्यतन कर रहा है, रिकॉर्डErlang: Mnesia: एक पंक्ति

-record(rec, {i, a,b}). 

अब मैं के रूप में तालिका में एक पंक्ति सम्मिलित उपयोग करके बनाए गए :

mnesia:transaction(fun() -> mnesia:write("T", #rec{i=1, a=2, b=3}, write) end). 

अब मैं अगर मैं इस पंक्ति को अद्यतन, और 10 के लिए एक का ही मूल्य को बदलना चाहते हैं, जबकि मैं और ख एक ही मूल्यों के साथ छोड़ रहा है क्या करते हो? क्या कोई एसक्यूएल समकक्ष है जैसे "UPDATE T SET a=10 WHERE i=1"?

मैं कुछ इस तरह करते हैं: आप की जरूरत है जो कुछ भी क्षेत्र

{rec,1,10,undefined} 

उत्तर

9

इस समारोह अगर एक mnesia में इस्तेमाल एक अद्यतन करेगा के मूल्य: लेन-देन

update_a(Tab, Key, Value) -> 
    fun() -> 
    [P] = mnesia:wread({Tab, Key}), 
    mnesia:write(P#pixel{a=Value}) 
    end. 

सुझाव: अगर आप कुछ वाक्य रचना चीनी है कि और अधिक SQL सिंटैक्स की तरह है चाहता हूँ QLC पर एक नज़र है।

प्रदर्शन के पाठ्यक्रम के लिए सबसे अच्छा बेंचमार्क है, लेकिन QLC भूमि के ऊपर है, मुझे यकीन है कि वे अन्य विवरण की तुलना में प्रासंगिक हैं नहीं कर रहा हूँ। मैंने अभी सोचा है कि आपके द्वारा दिया गया SQL उदाहरण उन सभी रिकॉर्ड्स को अपडेट करेगा जिनमें i=1 है। रिकॉर्ड के उस सेट को निकालने के लिए क्यूएलसी का उपयोग करना मिनेसिया कॉल से अधिक सुंदर है।

सूचना के लिए इसके अलावा, wread सीधे रिकॉर्ड पर एक लिखने ताला दावा करता है, क्योंकि हम समय है कि हम उस रिकॉर्ड अपडेट करेगा से आगे पता है। यह पहले एक रीड लॉक से बचने के लिए एक माइक्रो-ऑप्टिमाइज़ेशन है, फिर हमारे दिमाग को बदलें और एक लिखें लॉक प्राप्त करें। मैंने हालांकि लंबे समय तक बेंचमार्क नहीं किया है।

यदि प्रदर्शन अभी भी एक मुद्दा आप विभिन्न दृष्टिकोण जहां गंदा संचालन का उपयोग पर गौर करना चाहिए है। लेकिन आपको वास्तव में यह समझने की कोशिश करनी चाहिए कि आपको प्रति सेकंड कितने लेन-देन की आवश्यकता है, 'पर्याप्त तेज़' होने के लिए।

+0

मैं दक्षता पर नजर है की जरूरत है, तो आप की सिफारिश करेंगे मैं QLC या विधि आप ऊपर निर्दिष्ट किया है का उपयोग करें? – ErJab

+0

मैंने कोशिश की, और किसी कारण से यह काम नहीं करता है। मान अपडेट नहीं किया जा रहा है। – ErJab

+0

@ErJab, dirty_update_counter देखें, यह आपकी ज़रूरतों को पूरा कर सकता है। – Zed

2

मैं तुम्हें "पंक्ति" पढ़ने की जरूरत है विश्वास है, अद्यतन, और उसके बाद:

mnesia:transaction(fun() -> mnesia:write("T", #rec{i=1, a=10}, write) end) 

पंक्ति के रूप में संग्रहीत किया जाता है एक "लेन-देन" के भीतर परिणाम और इन कार्यों के सभी वापस लिखें।

+0

हाँ मैं भी इस बारे में विचार है, लेकिन यह एक महंगी आपरेशन नहीं होगी? – ErJab

+0

डाटाबेस सामान्य रूप से एक लेनदेन में "अद्यतन" संचालन करेगा या फिर वे शुद्धता की गारंटी कैसे देंगे? 'मैनेशिया' में मुझे लगता है कि किसी को इस समय से बचने के कारण किसी और कारण से अधिक स्पष्ट होना चाहिए। – jldupont