मेरे पास एसक्यूएल और लॉकिंग रणनीतियों के बारे में एक सवाल है। उदाहरण के तौर पर, मान लीजिए कि मेरी वेबसाइट पर छवियों के लिए एक दृश्य काउंटर है। अगर मैं एक sproc या निम्नलिखित बयानों प्रदर्शन करने के लिए इसी तरह की है:एसक्यूएल परमाणु वृद्धि और लॉकिंग रणनीतियों - क्या यह सुरक्षित है?
START TRANSACTION;
UPDATE images SET counter=counter+1 WHERE image_id=some_parameter;
COMMIT;
मान लें एक विशिष्ट image_id के लिए काउंटर समय t0 में मूल्य '0' है। यदि एक ही छवि काउंटर, एस 1 और एस 2 अपडेट करने वाले दो सत्र, टी 0 पर समवर्ती रूप से शुरू होते हैं, तो क्या कोई मौका है कि इन दो सत्रों में मूल्य '0' पढ़ा गया है, इसे '1' तक बढ़ाएं और दोनों काउंटर को '1' को अपडेट करने का प्रयास करें। ', तो काउंटर को' 2 'के बजाय मूल्य' 1 'मिलेगा?
s1: begin
s1: begin
s1: read counter for image_id=15, get 0, store in temp1
s2: read counter for image_id=15, get 0, store in temp2
s1: write counter for image_id=15 to (temp1+1), which is 1
s2: write counter for image_id=15 to (temp2+1), which is also 1
s1: commit, ok
s2: commit, ok
अंत परिणाम: गलत मान '1' image_id = 15 के लिए, 2.
मेरे सवालों का होना चाहिए रहे हैं:
- इस परिदृश्य संभव है?
- यदि हां, तो लेनदेन अलगाव स्तर क्या मायने रखता है?
- क्या कोई संघर्ष समाधानकर्ता है जो इस तरह के संघर्ष को त्रुटि के रूप में पहचानता है?
- कोई समस्या से बचने के लिए किसी विशेष वाक्यविन्यास का उपयोग कर सकता है (तुलना और स्वैप (सीएएस) या स्पष्ट लॉकिंग तकनीकों की तरह कुछ)?
मैं एक सामान्य जवाब में दिलचस्पी रखता हूँ, लेकिन अगर कोई भी कर रहे हैं मैं MySQL और InnoDB-विशिष्ट जवाब में दिलचस्पी रखता हूँ, क्योंकि मैं InnoDB पर दृश्यों को लागू करने के लिए इस तकनीक का उपयोग करने के लिए कोशिश कर रहा हूँ।
संपादित करें: निम्नलिखित परिदृश्य भी संभव हो सकता है, जिसके परिणामस्वरूप एक ही व्यवहार हो सकता है। मुझे लगता है कि हम अलगाव स्तर READ_COMMITED या उच्चतर हैं, ताकि एस 2 लेनदेन की शुरुआत से मूल्य प्राप्त हो, हालांकि एस 1 ने काउंटर को पहले ही '1' लिखा है।
s1: begin
s1: begin
s1: read counter for image_id=15, get 0, store in temp1
s1: write counter for image_id=15 to (temp1+1), which is 1
s2: read counter for image_id=15, get 0 (since another tx), store in temp2
s2: write counter for image_id=15 to (temp2+1), which is also 1
s1: commit, ok
s2: commit, ok
mysql http://stackoverflow.com/questions/4358732/is-incrementing-a-field-in-mysql-atomic || एमएस http://stackoverflow.com/questions/193257/in-ms-sql- सर्वर-is-there-a-way-to-atomically-increment-a-column-being-used-a –