LOCK IN SHARE MODE दूसरे थ्रेड को मान को पढ़ने की अनुमति देगा, लेकिन वास्तविक मान क्वेरी से पहले (पढ़ने के लिए) या लेनदेन से पहले (दोहराए जाने योग्य रीड) शुरू हो जाएगा (जैसा कि MySQL मल्टी-वर्जनिंग का उपयोग करता है; और क्या दूसरे लेनदेन द्वारा देखा जाना चाहिए अलगाव स्तर द्वारा परिभाषित किया गया है)। इसलिए यदि पढ़ने के समय पहला लेन-देन नहीं किया जाता है, तो पुराना मान पढ़ा जाएगा।
आपके परिदृश्य में सबसे अच्छा 1 लेनदेन है जो अद्यतन के लिए चयन के साथ रिकॉर्ड को लॉक करता है, रिकॉर्ड पर काम करने के अलावा दूसरा और प्रतिबद्ध/रोलबैक पर तीसरा रिकॉर्ड अनलॉक करता है।
अपडेट के लिए चयन के साथ दूसरा थ्रेड लेनदेन पहले पूरा होने की प्रतीक्षा करेगा, फिर वास्तविक मूल्य पढ़ेगा और अन्य लेनदेन के साथ जारी नहीं रखने का फैसला करेगा, लेकिन उपयोगकर्ता को यह सूचित करने के लिए कि रिकॉर्ड लॉक है।
गतिरोध से बचने के लिए, सुनिश्चित करें कि आप select for update
कर रहे हैं अद्वितीय अनुक्रमणिका का उपयोग करना।
उदाहरण कोड:
connection.setautocommit(false);
//transaction-1
PreparedStatement ps1 = "Select locked from tableName for update where id="key" and locked=false);
ps1.executeQuery();
//transaction 2
PreparedStatement ps2 = "Update tableName set locked=true where id="key";
ps2.executeUpdate();
connection.setautocommit(true); // here we allow other transactions / threads to see the new value
connection.setautocommit(false);
//transaction 3
PreparedStatement ps3 = "Update tableName set aField="Sthg" where id="key" And date="D" and topic="T";
ps3.executeUpdate();
// probably more queries
// reset locked to false
PreparedStatement ps4 = "Update tableName set locked=false where id="key";
ps4.executeUpdate();
//commit
connection.setautocommit(true);