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

mysql - Oracle के अनुक्रमों के समान एक तंत्र बनाना

निम्नलिखित अद्यतन के लिए एक सरल उदाहरण है इरादा लॉक . INNODB इंजन के साथ एक रो-लेवल लॉक। नमूना अगले उपलब्ध अनुक्रमों के लिए चार पंक्तियों को दिखाता है जो प्रसिद्ध आईएनएनओडीबी गैप विसंगति से ग्रस्त नहीं होंगे (वह मामला जहां AUTO_INCREMENT के असफल उपयोग के बाद अंतराल होता है)।

स्कीमा:

-- drop table if exists sequences;
create table sequences
(   id int auto_increment primary key,
    sectionType varchar(200) not null,
    nextSequence int not null,
    unique key(sectionType)
) ENGINE=InnoDB;

-- truncate table sequences;
insert sequences (sectionType,nextSequence) values
('Chassis',1),('Engine Block',1),('Brakes',1),('Carburetor',1);

नमूना कोड:

START TRANSACTION; -- Line1
SELECT nextSequence into @mine_to_use from sequences where sectionType='Carburetor' FOR UPDATE; -- Line2 
select @mine_to_use; -- Line3
UPDATE sequences set nextSequence=nextSequence+1 where sectionType='Carburetor'; -- Line4
COMMIT; -- Line5

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

उपरोक्त संग्रहीत कार्यविधि में:

DROP PROCEDURE if exists getNextSequence;
DELIMITER $$
CREATE PROCEDURE getNextSequence(p_sectionType varchar(200),OUT p_YoursToUse int)
BEGIN
    -- for flexibility, return the sequence number as both an OUT parameter and a single row resultset
    START TRANSACTION;
    SELECT nextSequence into @mine_to_use from sequences where sectionType=p_sectionType FOR UPDATE;
    UPDATE sequences set nextSequence=nextSequence+1 where sectionType=p_sectionType;
    COMMIT; -- get it and release INTENTION LOCK ASAP
    set [email protected]_to_use; -- set the OUT parameter
    select @mine_to_use as yourSeqNum; -- also return as a 1 column, 1 row resultset
END$$
DELIMITER ;

परीक्षण:

set @myNum:= -1;
call getNextSequence('Carburetor',@myNum);
+------------+
| yourSeqNum |
+------------+
|          4 |
+------------+
select @myNum; -- 4

अपनी आवश्यकताओं के अनुसार संग्रहीत कार्यविधि को संशोधित करें, जैसे अनुक्रम संख्या (या तो OUT पैरामीटर या परिणाम सेट) को पुनः प्राप्त करने के लिए 2 में से केवल 1 तंत्र होना। दूसरे शब्दों में, OUT . को छोड़ना आसान है पैरामीटर अवधारणा।

यदि आप LOCK के ASAP रिलीज़ का पालन नहीं करते हैं (जो स्पष्ट रूप से अपडेट के बाद आवश्यक नहीं है), और रिलीज़ से पहले समय लेने वाले कोड को निष्पादित करने के लिए आगे बढ़ते हैं, तो अनुक्रम की प्रतीक्षा कर रहे अन्य क्लाइंट के लिए टाइमआउट अवधि के बाद निम्नलिखित हो सकता है नंबर:

<ब्लॉकक्वॉट>

त्रुटि 1205 (HY000):लॉक प्रतीक्षा समय समाप्त हो गया; लेन-देन पुनः आरंभ करने का प्रयास करें

उम्मीद है कि यह कभी कोई मुद्दा नहीं होगा।

show variables where variable_name='innodb_lock_wait_timeout';

innodb_lock_wait_timeout के लिए MySQL मैन्युअल पेज ।

मेरे सिस्टम पर इस समय इसका मान 50 (सेकंड) है। ज्यादातर स्थितियों में एक या दो सेकंड से अधिक की प्रतीक्षा शायद असहनीय होती है।

लेन-देन के दौरान भी रुचि निम्न आदेश से आउटपुट का वह भाग है:

SHOW ENGINE INNODB STATUS;



  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 में इंडेक्स कैसे बनाएं

  3. MySQL त्रुटि 1290 (HY000) --सुरक्षित-फ़ाइल-निजी विकल्प

  4. मैं MySQL को पुनरारंभ किए बिना MySQL की धीमी क्वेरी लॉग को कैसे सक्षम कर सकता हूं?

  5. MySQL जाँचता है कि क्या कोई तालिका अपवाद को फेंके बिना मौजूद है