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

MySQL Select... इंडेक्स के साथ अपडेट के लिए समवर्ती समस्या है

विशुद्ध रूप से सैद्धांतिक दृष्टिकोण से, ऐसा लगता है कि आप सही पंक्तियों को लॉक नहीं कर रहे हैं (अपडेट स्टेटमेंट की तुलना में पहले स्टेटमेंट में अलग स्थिति; इसके अलावा आप LIMIT 1 के कारण केवल एक पंक्ति को लॉक करते हैं। , जबकि आप संभवतः बाद में और पंक्तियों को अपडेट करते हैं)।

इसे आजमाएं:

START TRANSACTION;
SELECT v_id FROM v_ext WHERE username IS NULL AND v_id=yyy FOR UPDATE;
UPDATE v_ext SET username=xxx WHERE v_id=yyy;
COMMIT;

[संपादित करें]

आपके गतिरोध के कारण के लिए, यह संभावित उत्तर है (मैन्युअल से ):

अनुक्रमणिका के बिना, SELECT ... FOR UPDATE स्टेटमेंट के पूरे टेबल को लॉक करने की संभावना है, जबकि एक इंडेक्स के साथ, यह केवल कुछ पंक्तियों को लॉक करता है। चूंकि आपने पहले कथन में सही पंक्तियों को लॉक नहीं किया था, इसलिए दूसरे कथन के दौरान एक अतिरिक्त लॉक प्राप्त किया जाता है।

जाहिर है, अगर पूरी टेबल लॉक है (यानी बिना इंडेक्स के) तो डेडलॉक नहीं हो सकता। दूसरे सेटअप में एक डेडलॉक निश्चित रूप से हो सकता है।



  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 5 में, SELECT COUNT(1) टेबल_नाम से बहुत धीमा है

  2. क्या आप अपेक्षित परिणाम प्राप्त करने के लिए क्वेरी या अन्य क्वेरी को संशोधित करने में मदद कर सकते हैं

  3. 500 आंतरिक सर्वर त्रुटि?

  4. JDBCExceptionReporter - SQL त्रुटि:0, SQLState:08001

  5. MySQL दिनांक स्वरूप धोखा पत्रक