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

एक पंक्ति डालें और दौड़ की स्थिति से बचें (PHP/MySQL)

आमतौर पर, ऐसे समवर्ती मुद्दों के समाधान में लेन-देन और आशावादी लॉकिंग . शामिल होते हैं :जब आप काउंटर को अपडेट करते हैं, तो where जोड़ें पुराने मान की जाँच करने और अद्यतन की गई पंक्तियों की संख्या गिनने के लिए खंड।

v = select value from counter where id=x.
update counter set value = v+1 where value = v and id=x

यदि इस दौरान काउंटर को अपडेट किया गया था, तो अपडेट किसी भी पंक्ति को नहीं बदलेगा -- इसलिए आप जानते हैं कि आपको रोलबैक करना होगा और लेन-देन को एक बार फिर से आज़माना होगा।

एक समस्या यह है कि इससे उच्च विवाद हो सकता है , केवल कुछ लेन-देन के साथ जो सफल होता है और बहुत कुछ विफल होता है।

तब निराशावादी लॉकिंग . से चिपके रहना बेहतर हो सकता है , जहां आप पहले पंक्ति को लॉक करते हैं, फिर उसे अपडेट करते हैं। लेकिन केवल एक बेंचमार्क ही आपको बताएगा।

संपादित करें

यदि आप आशावादी लॉकिंग के बिना लेनदेन का उपयोग करते हैं तो निम्न परिदृश्य हो सकता है।

Max authorized = 50. Current value = 49.

T1: start tx, read value --> 49
T2: start tx, read value --> 49
T1: update value --> 50, acquire a row lock
T1: commits --> release the lock
T2: update value --> 50, acquire a row lock
T2: commits --> release the lock

दोनों लेन-देन सफल होते हैं, मान 50 है, लेकिन एक असंगति है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. परिणामसेट से केवल पहली पंक्ति कैसे प्राप्त करें

  2. क्या किसी क्वेरी को एक रिकॉर्ड तक सीमित करने से प्रदर्शन में सुधार होता है

  3. डेटाबेस में रिकॉर्ड्स के समूह पर सॉर्ट-ऑर्डर स्टोर करने का सबसे प्रभावी तरीका क्या है?

  4. क्या PHP के preg_replace के बराबर एक MySQL है?

  5. Mysqld.service के लिए कार्य विफल रहा systemctl स्थिति देखें mysqld.service