मैं वर्तमान में लेन-देन के साथ खेल रहा हूं और निम्नलिखित परिदृश्य के चारों ओर अपने दिमाग को लपेट नहीं सकता:यह लेनदेन ActiveRecord में क्यों काम नहीं करता है?
उपयोगकर्ता नाम "जॉनी" और पूर्ण नाम "जॉन स्मिथ" के साथ उपयोगकर्ता है।
मैं दो पटरियों को शान्ति शुरू करने और इस क्रम में निम्न कमांड निष्पादित करें:
कंसोल एक:
ActiveRecord::Base.transaction { user = User.find_by_username("foo"); sleep 10; user.update_attribute(:full_name, "#{user.full_name}-1"); }
कंसोल बी:
ActiveRecord::Base.transaction { user = User.find_by_username("foo"); sleep 10; user.update_attribute(:full_name, "#{user.full_name}-2"); }
तो समय निम्नलिखित है:
ए "जॉन स्मिथ"
पढ़ता हैबी पढ़ता है "जॉन स्मिथ"
एक लिखते हैं, "जॉन स्मिथ -1"
बी लिखते हैं, "जॉन स्मिथ -2"
मेरी डेटाबेस वर्ग लेन-देन बी के अनुसार, "लिखने के लिए जॉन को विफल करना चाहिए स्मिथ -2 "क्योंकि डेटा इसे पढ़ने के बाद बदल गया। तो लेनदेन को रोलबैक किया जाना चाहिए और लेनदेन ए जीतना चाहिए। मैं उपयोगकर्ता नाम "जॉन स्मिथ -1" होने की उम्मीद करता हूं, लेकिन परिणाम "जॉन स्मिथ -2" है।
कोई विचार क्यों होता है या अपेक्षित व्यवहार कैसे प्राप्त करें?
तरह का संबंध
निल्स
यह कनेक्शन का अलगाव स्तर हो सकता है। सुनिश्चित करें कि यह आशावादी लॉकिंग है और कर्सर स्थिरता नहीं है। इसके अलावा, यह लेनदेन की वजह से, विडंबनापूर्ण हो सकता है। यदि दोनों ब्लॉक एक लेनदेन में हैं, तकनीकी रूप से, दूसरे को पहले खत्म होने तक * प्रारंभ * करना चाहिए, या इसे एसीआईडी में परिभाषित नियमों का पालन करना चाहिए कि दूसरा लेनदेन * जैसा कि पहले * खुश नहीं हुआ है, लेकिन * जैसे * दूसरा पूरा होने तक शुरू नहीं हुआ। –
आपको क्या लगता है कि यह activerecord विशिष्ट है?यदि आप डेटाबेस कमांड लाइन इंटरफ़ेस से एक समान कार्य करते हैं तो परिणाम अलग होता है? –
@FrederickCheung आपके द्वारा उपयोग किए जाने वाले एसक्यूएल पर निर्भर करता है। अगर यह 'अद्यतन ... अद्यतन के लिए' था तो यह अलग होगा। अभी भी ओपी उम्मीद नहीं करता है। लेकिन फिर यह निराशावादी लॉकिंग होगा: http://api.rubyonrails.org/classes/ActiveRecord/Locking/Pessimistic.html –