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

INSERT ... चुनें, InnoDB और लॉकिंग

यह सही है। तालिका में पंक्तियों से पढ़ी जा रही एक साझा लॉक के साथ बंद कर दिया गया है (SELECT परोक्ष रूप से LOCK IN SHARE MODE . है ) इससे बचने का कोई उपाय नहीं है। यह उस तरह का है जैसा आप सिस्टम से पूछ रहे हैं:एक शर्त से मेल खाने वाली सभी पंक्तियों की प्रतिलिपि बनाएँ। यह सुनिश्चित करने का एकमात्र तरीका वास्तव में सभी पंक्तियाँ हैं जो शर्त से मेल खाती हैं और यह कि सूची उस कथन के निष्पादन के दौरान या उसके तुरंत बाद नहीं बदलती है, पंक्तियों को लॉक करना है।

आप INSERT . में असमर्थ क्यों हैं, इस बारे में स्पष्टीकरण के रूप में group_id = 2 . के साथ :

यह आपकी क्वेरी विशेष रूप से WHERE group_id = 3 AND created < '2014-01-04' से संबंधित है पर KEY group_id_created (group_id, created) . group_id = 3 AND created < '2014-01-04' बनाने वाली सभी पंक्तियों को खोजने के लिए इंडेक्स को पहली पंक्ति से शुरू करके पीछे की ओर घुमाया जाएगा जो उस स्थिति से ऊपर की सीमा से अधिक है, जो कि (3, '2014-01-14') है। और तब तक जारी रहता है जब तक एक पंक्ति नहीं मिल जाती है जो उस शर्त से मेल नहीं खाती है, जो कि created . के बाद से है कोई निचली सीमा नहीं है, पहली पंक्ति होगी जहां group_id < 3 group_id = 2 . निश्चित रूप से कौन सा है ।

इसका मतलब है कि पहली पंक्ति का सामना group_id = 2 . के साथ हुआ भी है लॉक किया गया, जो अधिकतम created . के साथ पंक्ति होगी मूल्य। यह INSERT . को असंभव बना देगा (2, MAX(created)) . के बीच "अंतराल" में और (3, MIN(created)) (बिल्कुल सही एसक्यूएल नहीं, सिर्फ छद्म एसक्यूएल), हालांकि यह विशेष रूप से "गैप लॉक" नहीं है।




  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 तारीखों में से नवीनतम के अनुसार मैसकल ऑर्डर आइटम

  2. mysql डेटाबेस से कनेक्ट नहीं हो सकता [स्ट्रेटो]

  3. Django:देव के लिए sqlite, उत्पादन के लिए mysql?

  4. नेस्टेड सेट का उपयोग करके डायनामिक मेनू बनाएं

  5. मैं पीडीओ कनेक्शन स्ट्रिंग में विशेष वर्णों से कैसे बच सकता हूं?