Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

अद्यतन के लिए v/s शेयर मोड में लॉक करें:समवर्ती थ्रेड्स को लॉक की गई पंक्ति के अद्यतन स्थिति मान को पढ़ने की अनुमति दें

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);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. स्टैंडअलोन MySQL सर्वर

  2. MySql क्वेरी एनालाइज़र - मुफ़्त समाधान

  3. डिव की सामग्री को केवल तभी ताज़ा करें जब डेटाबेस में नई सामग्री जोड़ी जाए

  4. MySql पर एकाधिक कॉलम फ़िल्टर करके एकाधिक संख्याओं को कैसे सीमित करें?

  5. दो तालिकाओं से SQL डेटा खींचे