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

उस तालिका की प्रतिलिपि बनाते समय अद्यतनों को रोकने के लिए मैं एक InnoDB तालिका को कैसे लॉक कर सकता हूं?

लंबे उत्तर के लिए क्षमा करें, लेकिन इसका उत्तर कई भागों में देना होगा।

<मजबूत>1. LOCK TABLES के साथ InnoDB तालिकाओं को लॉक करने पर सामान्य तौर पर

LOCK TABLES . का उपयोग करना InnoDB के साथ वास्तव में काम करता है, और एक ही सर्वर से जुड़े MySQL CLI के दो उदाहरणों के साथ प्रदर्शित किया जा सकता है (mysql-1 द्वारा चिह्नित) और mysql-2 ) नीचे दिए गए उदाहरण में। ग्राहकों पर प्रभाव के कारण इसे आम तौर पर किसी भी प्रकार के उत्पादन के संदर्भ में टाला जाना चाहिए, लेकिन कभी-कभी यह एकमात्र विकल्प हो सकता है।

एक तालिका बनाएं और इसे कुछ डेटा के साथ भरें:

mysql-1> create table a (id int not null primary key) engine=innodb;
Query OK, 0 rows affected (0.02 sec)

mysql-1> insert into a (id) values (1), (2), (3);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

टेबल लॉक करें:

mysql-1> lock tables a write;
Query OK, 0 rows affected (0.00 sec)

mysql-2 . से डालने का प्रयास करें , जो लॉक पर प्रतीक्षा में लटका रहेगा:

mysql-2> insert into a (id) values (4);

अब mysql-1 . से टेबल को अनलॉक करें :

mysql-1> unlock tables;
Query OK, 0 rows affected (0.00 sec)

और अंत में mysql-2 अनब्लॉक और रिटर्न:

Query OK, 1 row affected (6.30 sec)

<मजबूत>2. परीक्षण के लिए phpMyAdmin का उपयोग करना

PhpMyAdmin का उपयोग करने वाली आपकी परीक्षण विधि अमान्य है क्योंकि phpMyAdmin अपने वेब इंटरफ़ेस से प्रश्नों के बीच सर्वर से लगातार कनेक्शन बनाए नहीं रखता है। किसी भी प्रकार के लॉकिंग का उपयोग करने के लिए LOCK TABLES , START TRANSACTION , आदि, आपको लॉक होने के दौरान एक कनेक्शन बनाए रखने की आवश्यकता है।

<मजबूत>3. कार्य के दौरान आवश्यक सभी तालिकाओं को लॉक करना

एक बार जब आप LOCK TABLES . का उपयोग कर लेते हैं, तो MySQL जिस तरह से टेबल को लॉक कर देता है किसी भी चीज़ को स्पष्ट रूप से लॉक करने के लिए, आप किसी भी अन्य टेबल तक नहीं पहुंच पाएंगे जो कि LOCK के दौरान स्पष्ट रूप से लॉक नहीं किए गए थे। ... UNLOCK सत्र। अपने उपरोक्त उदाहरण में, आपको उपयोग करने की आवश्यकता है:

LOCK TABLES my_table WRITE, new_table WRITE, table2 READ;

(मैं मान रहा हूं table2 उप-चयन में प्रयुक्त टाइपो नहीं था।)

<मजबूत>4. RENAME TABLE . का उपयोग करके परमाणु तालिका की अदला-बदली

इसके अतिरिक्त, मुझे ध्यान देना चाहिए कि DROP TABLE . का उपयोग करके मौजूदा तालिका को बदलना उसके बाद RENAME TABLE एक संक्षिप्त क्षण का कारण होगा जहां तालिका मौजूद नहीं है, और यह उन ग्राहकों को भ्रमित कर सकता है जो इसके अस्तित्व की उम्मीद करते हैं। आमतौर पर ऐसा करना बेहतर होता है:

CREATE TABLE t_new (...);
<Populate t_new using some method>
RENAME TABLE t TO t_old, t_new TO t;
DROP TABLE t_old;

यह दो तालिकाओं का परमाणु विनिमय करेगा।




  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. mysql_escape_string कमजोरियाँ

  3. कैसे mysql अपडेट सेल्फ टेबल काम करता है

  4. क्या mysql कनेक्शन बंद करना महत्वपूर्ण है?

  5. मेरा डेटा AJAX का उपयोग कर डेटाबेस में सहेज नहीं रहा है