2011-07-21 18 views
7

मैं एक बहुप्रचारित एप्लिकेशन पर काम कर रहा हूं जो अपने प्राथमिक डेटाबेस के लिए डीबी 2 का उपयोग करता है। अतीत में हमने ज्यादातर टेबल के लिए पहचान कॉलम का उपयोग किया है जहां हमें एक ऑटो-जेनरेटेड अद्वितीय पहचानकर्ता की आवश्यकता होती है। ऐसा करने के लिए हम एक ही लेनदेन में नीचे दिए गए 2 प्रश्नों को चलाएंगे:मल्टीथ्रेडेड एप्लिकेशन में डीबी 2 अनुक्रम मूल्य कैसे प्राप्त करें

INSERT INTO tbname (IDENTITY_COL, ...) VALUES (DEFAULT, ...); 
SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1; 

हमें अब अनुक्रम पर स्विच करने के लिए दबाव डाला जा रहा है। मुझे पता है कि आप INSERT और SELECT कथन दोनों में "कॉलनाम" के लिए अगला VALUE का उपयोग कर सकते हैं, लेकिन मैं यह नहीं समझ सकता कि दोनों मल्टीथ्रेड किए गए एप्लिकेशन में दौड़ की स्थिति को जोखिम के बिना INSERT और समान मूल्य के साथ कैसे चुनें। उदाहरण के लिए, अगर मैं का उपयोग करें:

INSERT INTO tbname (SEQUENCE_COL, ...) VALUES (NEXT VALUE FOR SEQUENCE_COL, ...); 
SELECT PREVIOUS VALUE FOR SEQUENCE_COL; 

तो फिर वहाँ एक संभावना एक और सम्मिलित करें ऊपर सम्मिलित करें और चयन के बीच चलाया गया था, इसलिए मुझे गलत मान प्रदान है। अगर मैं कोशिश:

SELECT NEXT VALUE FOR SEQUENCE_COL; 

दुकान एक चर में मूल्य और पारित सम्मिलित करने के लिए में है कि:

INSERT INTO tbname (SEQUENCE_COL, ...) VALUES (variable_value, ...); 

तो फिर वहाँ एक संभावना एक और धागा एक ही अगले मूल्य मिल गया है और एक ही मान सम्मिलित करने की कोशिश करता , जिसके परिणामस्वरूप डीबी 2 -803 त्रुटि हुई। क्या बहुसंख्यक वातावरण में सेक्वेंस कॉलम का उपयोग करना संभव है, या क्या मुझे अपना पहचान कॉलम रखने के लिए लड़ने की आवश्यकता है?

उत्तर

6

के अलावा माइकल Sharek (सही ढंग से) क्या कहा:

INSERT INTO tbname (SEQUENCE_COL, ...) VALUES (NEXT VALUE FOR SEQUENCE_COL, ...); 
SELECT PREVIOUS VALUE FOR SEQUENCE_COL; 

आपका धारणा तो फिर वहाँ एक संभावना एक और सम्मिलित करें ऊपर सम्मिलित करें और चयन के बीच चलाया गया था है, इसलिए मुझे गलत मान "के बारे में उपलब्ध कराने के बयानों के अनुक्रम के ऊपर गलत है।

"अगला मान" और "पिछला मान" कनेक्शन विशिष्ट है।

विभिन्न धागे से अनुक्रम तक पहुंच कभी भी "दौड़" स्थिति नहीं बनाएगी। अनुक्रम के लिए प्रत्येक कनेक्शन में पूरी तरह से अलग "पर्यावरण" होता है।

+0

कनेक्शन-विशिष्ट स्पष्टीकरण प्रदान करने के लिए आपको बहुत बहुत धन्यवाद। वास्तव में मुझे क्या सुनने की जरूरत है। –

6

आपको अपने प्रश्न में गलत धारणा मिली है।

अगर मैं कोशिश:

SELECT NEXT VALUE FOR SEQUENCE_COL; 

दुकान एक चर में मूल्य और सम्मिलित करने के लिए में है कि पारित:

INSERT INTO tbname (SEQUENCE_COL, ...) VALUES (variable_value, ...); 

तो फिर वहाँ एक संभावना है एक और धागा एक ही अगला मूल्य मिला और मैं कोशिश करता हूं nsert एक ही मान

यह सही नहीं है। दूसरा धागा एक अलग NEXTVAL प्राप्त करेगा और पहले धागे के समान मूल्य नहीं होगा।

मैं भी इस ओर से मेरी राय जोड़ना चाहते हैं:

अब हम बजाय अनुक्रम में स्विच करने के लिए दबाव डाला जा रहा है।

मैं कल्पना नहीं कर सकता कि पहचान से अनुक्रमों पर स्विच करने का वास्तव में एक अच्छा कारण है। वे मूल रूप से एक ही बात हैं।

+0

प्रतिक्रिया के लिए धन्यवाद। A_horse_with_no_name द्वारा प्रदान की गई कनेक्शन सुरक्षा की स्पष्टीकरण मुझे यह ठीक समझती है कि यह ठीक क्यों है, लेकिन दोनों उत्तरों ने बहुत मदद की। दबाव के लिए, यह पहचानों पर कुछ ओवरहेड खोना है और प्रोग्रामर को इस कॉलम सेट (उच्च स्तरीय स्पष्टीकरण) के बारे में अधिक जानकारी देना है। –

2

अन्य सही जवाब के अलावा, आप भी सिर्फ एक बयान इस प्रकार एक पंक्ति सम्मिलित और डाला मूल्यों वापस जाने के लिए उपयोग कर सकते हैं:

SELECT SEQUENCE_COL FROM NEW TABLE (
    INSERT INTO tbname (SEQUENCE_COL, ...) VALUES (NEXT VALUE FOR MY_SEQUENCE, ...) 
)