जब पैरेललिज़्म काटता है - एक _high Oracle Autonomous DB (OCI) पर ORA-12860

लेखक
Damian
Terlecki
3 मिनट पढ़ें
डेटाबेस

हाल ही में, मैं OCI पर Oracle Autonomous Database का उपयोग करके एक छोटे ऐप का प्रोटोटाइप बना रहा था। मैंने ज्यादा नहीं सोचा और बस पहला उपलब्ध _high सर्विस नाम चुन लिया, आने वाली मुसीबत को बिना भांपे। आखिर, "_high" "_low" से बेहतर लगता है, है ना?

कुछ समय बाद, मैंने अजीब व्यवहार पर ध्यान देना शुरू किया, खासकर जब एक ही ट्रांजैक्शन के भीतर एक टेबल से रिकॉर्ड्स को डिलीट और फिर से इंसर्ट कर रहा था।

टेबल सरल थी:

CREATE TABLE foo (
    bar_id      VARCHAR2(255) PRIMARY KEY,
    bar_user_id VARCHAR2(255) NOT NULL,
    bar_content VARCHAR2(2000)
);

मेरे पास उसमें कुछ रिकॉर्ड्स थे और मैं उन्हें डिलीट करके पुराने और नए दोनों को फिर से इंसर्ट करने की कोशिश कर रहा था:

DELETE FROM foo WHERE bar_user_id = 'some_user_id';

INSERT INTO foo (bar_id, bar_user_id, bar_content) VALUES ('old_id_1', 'some_user_id', 'new_content');
INSERT INTO foo (bar_id, bar_user_id, bar_content) VALUES ('old_id_2', 'some_user_id', 'new_content');
-- ...अधिक इंसर्ट्स

अचानक, मुझे यह मिला:

ORA-12860: deadlock detected while waiting for a sibling row lock

इतने सरल ऑपरेशन से मुझे ऐसी उम्मीद नहीं थी।

मैंने टेबल सेटिंग्स, इंडेक्स, ट्रिगर्स की जाँच की - कुछ भी खास नहीं दिखा। फिर मेरे दिमाग में आया - मुझे DB सेवाओं के बारे में कुछ याद आया कि वे अलग-अलग वर्कलोड के लिए ऑप्टिमाइज़ की गई हैं। वास्तविक मुद्दा _high सेवा का उपयोग करते समय सेशन का पैरेललिज़्म लेवल निकला। एक DBA अकाउंट से gv$px_session पर एक त्वरित नज़र ने 1 से अधिक degree मान की पुष्टि की।

v$session और v$transaction को saddr से जोड़ने पर मुझे जल्दी ही और जानकारी मिल गई। शुरुआती DELETE 4 पैरेलल स्लेव्स को जन्म दे रहा था। फिर पहले से डिलीट की गई पंक्तियों के निम्नलिखित INSERTs ने उसी ट्रांजैक्शन के अंदर आंतरिक डेडलॉक को हिट किया।

आश्चर्य नहीं कि _low सर्विस नाम पर स्विच करने से, जो पैरेललिज़्म को डिसेबल कर देता है, समस्या हल हो गई।

यदि आप एक समान समस्या के लिए ORA-12860 त्रुटि में भागे और यह पाया, तो मुझे उम्मीद है कि इस त्वरित स्पष्टीकरण ने आपका थोड़ा सिरदर्द बचाया होगा। लिखने के समय, इस त्रुटि के लिए खोज परिणाम बहुत मददगार नहीं हैं।

अधिक जानकारी के लिए OCI Oracle Autonomous Database सेवा विवरण देखें।