2013-06-28 24 views
15

मुझे अक्सर "एप्लिकेशन की प्रतीक्षा करते समय यह" ओआरए 00060 डेडलॉक पता चला है "त्रुटि अक्सर मेरे एप्लिकेशन में जब एकाधिक उपयोगकर्ता एप्लिकेशन का उपयोग कर रहे हैं। मुझे ऑरैक एडमिन से ट्रेस फ़ाइल मिली है, लेकिन इसे पढ़ने में मदद की ज़रूरत है। नीचे ट्रेस फ़ाइल से डेटा की बिट्स है, जो मुझे उम्मीद है कि कारण तलाशने में मदद मिलेगी।ऑरैकल ट्रेस फ़ाइल से डेडलॉक त्रुटि का कारण ढूंढना

*** 2013-06-25 09:37:35.324 
DEADLOCK DETECTED (ORA-00060) 

[Transaction Deadlock] 

The following deadlock is not an ORACLE error. It is a deadlock due 
to user error in the design of an application 
or from issuing incorrect ad-hoc SQL. The following 
information may aid in determining the deadlock: 

Deadlock graph: 
        ---------Blocker(s)-------- ---------Waiter(s)--------- 
Resource Name   process session holds waits process session holds waits 
TM-000151a2-00000000  210  72 SX SSX  208  24 SX SSX 
TM-000151a2-00000000  208  24 SX SSX  210  72 SX SSX 

session 72: DID 0001-00D2-000000C6 session 24: DID 0001-00D0-00000043 
session 24: DID 0001-00D0-00000043 session 72: DID 0001-00D2-000000C6 

Rows waited on: 
Session 72: no row 
Session 24: no row 

----- Information for the OTHER waiting sessions ----- 
Session 24: 
sid: 24 ser: 45245 audsid: 31660323 user: 90/USER 
    flags: (0x45) USR/- flags_idl: (0x1) BSY/-/-/-/-/- 
    flags2: (0x40009) -/-/INC 
pid: 208 O/S info: user: zgrid, term: UNKNOWN, ospid: 2439 
    image: [email protected] 
client details: 
    O/S info: user: , term: , ospid: 1234 
    machine: xyz.local program: 
current SQL: 
    delete from EMPLOYEE where EMP_ID=:1 

----- End of information for the OTHER waiting sessions ----- 

Information for THIS session: 

----- Current SQL Statement for this session (sql_id=dyfg1wd8xa9qt) ----- 
delete from EMPLOYEE where EMP_ID=:1 
=================================================== 

अगर कोई मुझे बता सकता है कि "डेडलॉक ग्राफ ::" क्या कह रहा है तो मैं सराहना करता हूं। अनुभाग में इंतजार की गई पंक्तियों में कोई पंक्ति नहीं है।

मैंने कुछ ब्लॉगों में भी पढ़ा है कि ट्रेस फ़ाइल से "sqltxt" खंड कारण का सुझाव दे सकता है। नीचे वह प्रश्न है जो मैं उस खंड में देखता हूं।

select /*+ all_rows */ count(1) from "USERS"."EMPLOYEE_SALARY" where EMPSAL_EMP_ID=:1 

employee_salary तालिका EMPSAL_EMP_ID स्तंभ पर foreignkey बाधा है।

एसक्यूएल संकेत "all_rows" कहता है, तो क्या इसका मतलब यह है कि कर्मचारी तालिका से रिकॉर्ड हटाने पर यह तालिका तालिका स्तर लॉक हो जाती है? मेरे पास वर्तमान में विदेशी कुंजी कॉलम पर एक अनुक्रमणिका नहीं है। इस कॉलम सहायता पर एक इंडेक्स जोड़ना होगा?

कृपया पोस्ट करें, अगर किसी और जानकारी की आवश्यकता हो तो कृपया पोस्ट करें।

धन्यवाद

+1

ओरेकल में लॉक मोड पर अच्छा विषय: http://www.soug.ch/fileadmin/user_upload/Newsletter/NL_public/NL_2013_1_Award_Article.pdf ऐसा लगता है कि आप 'USERS.EMPLOYEE_SALARY.EMPSAL_EMP_ID' ​​कॉलम और विदेशी बाधा के साथ इंडेक्स को याद करते हैं 'कैस्केड हटाएं' पर। – ThinkJet

+0

ऐसा लगता है कि आपके पास एक ही पंक्ति को हटाने का प्रयास करने वाले दो सत्र हैं। – haki

उत्तर

27

सबसे पहले, select बयान Oracle में कुछ भी ताला कभी नहीं, बस डेटा के अंतिम उपलब्ध संगत संस्करण का उपयोग करता। यह select ... for update के लिए कोई मामला नहीं है जो Oracle 9i के बाद update जैसे डेटा को लॉक करता है, लेकिन प्रश्न से पूछताछ में for update खंड नहीं है।

Resource Name   process session holds waits process session holds waits 
TM-000151a2-00000000  210  72 SX SSX  208  24 SX SSX 

सत्र # 72 "पंक्ति विशेष" प्रकार (SX) के साथ तालिका स्तरीय ताला (टीएम) रखती है और "शेयर पंक्ति अनन्य" (SSX) एक ही मेज पर ताला हासिल करना चाहते हैं। यह सत्र सत्र # 24 द्वारा अवरुद्ध है जो पहले से ही एक ही प्रकार (एसएक्स) के टेबल-स्तरीय लॉक रखता है और प्रतीक्षा करता है जबकि एसएसएक्स लॉक उपलब्ध होगा।

Resource Name   process session holds waits process session holds waits 
TM-000151a2-00000000  208  24 SX SSX  210  72 SX SSX 

यह (दूसरी पंक्ति) ठीक उसी स्थिति दर्शाता है, लेकिन में विपरीत दिशा: सत्र # SSX के लिए 24 प्रतीक्षा करता है उपलब्ध हो जाते हैं ताला, लेकिन सत्र # 72 जो पहले से ही एक ही मेज पर SX ताला धारण द्वारा अवरुद्ध कर दिया।

तो, सत्र # 24 और सत्र # 72 एक-दूसरे को अवरुद्ध करते हैं: डेडलॉक होता है।

दोनों लॉक प्रकार (एसएक्स और एसएसएक्स) टेबल-स्तरीय ताले हैं।
स्थिति को समझने के लिए मैं फ्रैंक पैचोट द्वारा this article पढ़ने की अनुशंसा करता हूं।

Referential अखंडता भी टीएम ताले प्राप्त कर लेता है:

नीचे इस लेख, जो सीधे अपनी स्थिति के लिए प्रासंगिक (ध्यान दें कि SSX और SRX संक्षिप्त रूपों के बराबर हैं) से प्रशस्ति पत्र है। उदाहरण के लिए, असीमित विदेशी कुंजी के साथ समस्या पर बच्चे की मेज पर एस ताले की ओर जाता है जब आप मूल तालिका पर एक डिलीट जारी करते हैं, या कुंजी पर अपडेट करते हैं। यह है क्योंकि बिना किसी इंडेक्स के, ओरेकल के पास लॉक के लिए कोई एकल निम्न स्तर संसाधन नहीं है जो एक समवर्ती डालने से रोकने के लिए है जो संदर्भित अखंडता का उल्लंघन कर सकता है।
जब विदेशी कुंजी कॉलम नियमित सूचकांक में अग्रणी कॉलम होते हैं, तो पैरेंट मान के साथ पहली अनुक्रमणिका प्रविष्टि को एक संसाधन के रूप में उपयोग किया जा सकता है और पंक्ति स्तर TX लॉक के साथ लॉक किया जा सकता है।
और क्या होगा अगर रेफरेंसियल अखंडता को कैस्केड हटाया जाए? एस मोड के अतिरिक्त, पंक्ति X (RX) मोड के साथ बाल तालिका में पंक्तियों को अपडेट करने का इरादा है। यह वह जगह है जहां शेयर पंक्ति अनन्य (एसआरएक्स) होती है: एस + आरएक्स = एसआरएक्स।

तो, सबसे संभावित संस्करण है कि सत्र # 72 और सत्र # 24 एक ही समय में EMPLOYEE तालिका में कुछ पंक्तियों को हटा देता है, और वहाँ on delete cascade बाधा EMPLOYEE_SALARY मेज पर सूचकांक के अभाव के साथ संयोजन के रूप में EMPSAL_EMP_ID के लिए जो कर रहे हैं EMPSAL_EMP_ID कॉलम में पहले सूचीबद्ध

+0

एक टन धन्यवाद। आप स्पष्टीकरण कुरकुरा और स्पष्ट है। – shashikanthb

संबंधित मुद्दे