हालांकि मैं इसके खिलाफ दृढ़ता से अनुशंसा करता हूं (एक अनुक्रम का उपयोग करना पसंद करते हैं और केवल यह स्वीकार करते हैं कि अपेक्षित अंतराल से बड़ा होगा), आप अपनी खुद की छद्म-अनुक्रम तालिका बना सकते हैं
CREATE TABLE my_sequences (
sequence_name VARCHAR2(30) PRIMARY KEY,
sequence_val NUMBER
);
कुछ पंक्तियाँ डालें
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupA', 1 );
INSERT INTO my_sequences( sequence_name, sequence_val )
VALUES( 'GroupB', 1 );
और फिर अगला अनुक्रम मान प्राप्त करने के लिए एक फ़ंक्शन लिखें
CREATE FUNCTION get_nextval( p_sequence_name IN VARCHAR2 )
RETURN NUMBER
IS
l_val NUMBER;
BEGIN
SELECT sequence_val
INTO l_val
FROM my_sequences
WHERE sequence_name = p_sequence_name
FOR UPDATE;
UPDATE my_sequences
SET sequence_val = sequence_val + 1
WHERE sequence_name = p_sequence_name;
RETURN l_val;
END;
यह विशेष अनुक्रम के लिए तालिका में पंक्ति को तब तक लॉक कर देगा जब तक कि अगली पंक्ति को पुनर्प्राप्त करने वाला लेनदेन या तो वापस नहीं आ जाता है या वापस आ जाता है। यह ओरेकल अनुक्रमों का उपयोग करने की तुलना में आपके आवेदन की मापनीयता को मौलिक रूप से कम कर देगा, यह सुनिश्चित करके कि केवल एक सत्र किसी विशेष group_name
के लिए एक पंक्ति सम्मिलित कर सकता है एक बार में-- अन्य अनुक्रम के लिए प्रतीक्षा करना बंद कर देंगे। यदि आपके पास अपेक्षाकृत कम संख्या में समवर्ती उपयोगकर्ताओं (या अपेक्षाकृत बड़ी संख्या में group_name
वाला सिस्टम है। मान), जो आपको स्वीकार्य हो सकता है। लेकिन सामान्य तौर पर यह एक खराब अभ्यास है। ओरेकल संस्करण के आधार पर, आप समेकन बढ़ाने के लिए स्वायत्त लेनदेन का उपयोग करने में सक्षम हो सकते हैं लेकिन यह समाधान में केवल एक और जटिलता जोड़ता है। उस बिंदु पर जब आप वास्तव में मापनीयता के बारे में चिंतित हैं, तो आप वास्तव में संपूर्ण डिज़ाइन को पीछे धकेलना चाहते हैं और केवल Oracle अनुक्रम का उपयोग करना चाहते हैं।