मुझे लगता है कि इसे संभालने का सबसे अच्छा तरीका यहां वर्णित अद्यतन पैटर्न के लिए चयन ... का उपयोग करना होगा:http://dev.mysql.com/doc/refman/5.0/hi/innodb-locking-reads.html
संदर्भ के लिए:
SELECT counter_field FROM child_codes FOR UPDATE; UPDATE child_codes
SET counter_field = counter_field + 1;
...
तो आपके मामले में, आप प्रतिस्थापित करेंगे
LOCK TABLES AlarmCount WRITE, AlarmMembership READ;
UPDATE AlarmCount SET num = num - 1
WHERE RuleId = OLD.RuleId AND
MemberId = 0 AND
IsResolved = OLD.IsResolved;
कुछ इस तरह के साथ
SELECT num FROM AlarmCount WHERE RuleId = OLD.RuleId AND
MemberId = 0 AND
IsResolved = OLD.IsResolved FOR UPDATE;
UPDATE AlarmCount SET num = num - 1;
मैं "कुछ ऐसा" कहता हूं क्योंकि यह मेरे लिए पूरी तरह से स्पष्ट नहीं है कि OLD.RuleId और OLD.IsResolved क्या संदर्भित कर रहा है। http://dev.mysql से भी ध्यान देने योग्य .com/doc/refman/5.0/hi/innodb-locking-reads.html है:
UPDATE child_codes SET counter_field = LAST_INSERT_ID(counter_field +
1);
SELECT LAST_INSERT_ID();
दूसरे शब्दों में, आप संभवतः केवल एक बार तालिका तक पहुँच कर इस पैटर्न को और अधिक अनुकूलित कर सकते हैं ... घ की जरूरत है। मुझे लगता है कि यदि आप एक नज़र डालते हैं, तो चुनें ... अद्यतन के लिए, हालांकि, आप देखेंगे कि पैटर्न क्या है, और आपको अपने वातावरण में यह काम करने के लिए क्या करने की आवश्यकता है।
मुझे यह भी उल्लेख करना चाहिए कि कुछ भंडारण इंजन वातावरण और लेनदेन अलगाव स्तर हैं जिन पर आप विचार करना चाहेंगे। यहाँ इस विषय पर SO पर बहुत अच्छी चर्चा है:अपडेट के लिए चुनें ... का उपयोग कब करें?
आशा है कि यह मदद करता है!