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

MySQL:टेबल लॉकिंग के बजाय रो-लेवल ट्रांजैक्शन लॉकिंग कैसे प्राप्त करें

यह देखना उपयोगी हो सकता है कि यह क्वेरी वास्तव में MySQL द्वारा कैसे निष्पादित की जाती है:

select * from tbl_codes where available = 1 order by rand() limit 1 for update

यह WHERE . से मेल खाने वाली सभी पंक्तियों को पढ़ेगा और क्रमबद्ध करेगा स्थिति, rand() . का उपयोग करके एक यादृच्छिक संख्या उत्पन्न करें प्रत्येक पंक्ति के लिए एक वर्चुअल कॉलम में, उस वर्चुअल कॉलम के आधार पर सभी पंक्तियों (एक अस्थायी तालिका में) को सॉर्ट करें, और फिर क्लाइंट को सॉर्ट किए गए सेट से LIMIT तक पंक्तियों को वापस कर दें। पहुंच गया है (इस मामले में सिर्फ एक)। FOR UPDATE क्रियान्वित होने के दौरान पूरे स्टेटमेंट द्वारा किए गए लॉकिंग को प्रभावित करता है, और इस तरह क्लॉज को लागू किया जाता है क्योंकि पंक्तियों को InnoDB के भीतर पढ़ा जाता है। , नहीं जैसे ही वे क्लाइंट को वापस कर दिए जाते हैं।

उपर्युक्त (यह भयानक है) के स्पष्ट प्रदर्शन प्रभावों को छोड़कर, आपको इससे उचित लॉकिंग व्यवहार कभी नहीं मिलेगा।

संक्षिप्त उत्तर:

  1. RAND() का उपयोग करके अपनी इच्छित पंक्ति का चयन करें या कोई अन्य रणनीति जो आपको पसंद हो, PRIMARY KEY . खोजने के लिए उस पंक्ति का मूल्य। उदा.:SELECT id FROM tbl_codes WHERE available = 1 ORDER BY rand() LIMIT 1
  2. उसकी PRIMARY KEY का उपयोग करके अपनी इच्छित पंक्ति को लॉक करें केवल। उदा.:SELECT * FROM tbl_codes WHERE id = N

उम्मीद है कि यह मदद करता है।



  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 को कॉलम को UNIQUE बनाने की आवश्यकता नहीं है। त्रुटि 'कॉलमनाम' को ड्रॉप नहीं कर सकती है, जांचें कि कॉलम/कुंजी मौजूद है

  2. C++ executeQuery() तालिका से MySQL डेटा प्रदर्शित करने में त्रुटि

  3. सक्रिय रिकॉर्ड के साथ कोडइग्निटर और or_like

  4. क्या मैं मौजूदा MySql स्कीमा को प्रतिबिंबित करने के लिए स्क्वेरिल डेटा ऑब्जेक्ट स्वतः उत्पन्न कर सकता हूं?

  5. रेल:एक ही ऐप में एक ही समय में MySQL और पोस्टग्रेस?