जब कोई रिकॉर्ड ओरेकल में बंद हो जाता है, तो क्या हम जान सकते हैं कि कौन सा रिकॉर्ड लॉक है?


10

जब कोई रिकॉर्ड लॉक होता है, तो क्या हम जान सकते हैं कि कौन सा लॉक है?

मैं कैसे रिकॉर्ड उपद्रवी या कुछ और जानकारी प्राप्त कर सकता हूं?


मैं इस sql द्वारा कुछ जानकारी प्राप्त कर सकते हैं

SELECT c.ROW_WAIT_OBJ#,c.ROW_WAIT_FILE#,c.ROW_WAIT_BLOCK#,c.ROW_WAIT_ROW#
   FROM v$locked_object a, dba_objects b, v$session c    
WHERE a.object_id = b.object_id    
    AND a.SESSION_ID = c.sid(+) 

मैंने फ़ंक्शन का उपयोग करके वेब पर पंक्तिबद्ध होने के लिए एक विधि ढूंढी DBMS_ROWID.ROWID_CREATE()

लेकिन यह काम नहीं करता है।


2
आप केवल ताले देख सकते हैं कि कुछ प्रक्रिया की प्रतीक्षा कर रहे हैं, न कि उन लोगों द्वारा जो एक लेनदेन द्वारा आयोजित की जाती हैं।
a_horse_with_no_name

@a_horse_with_no_name - v $ लॉक आपको एक लेन
क्रिस सैक्सन

@ क्रिसचक्सन: आप सही कह रहे हैं। मैं इस तथ्य का उल्लेख कर रहा था कि आप यह नहीं देख सकते हैं कि कौन सी पंक्तियों को लॉक किया गया है - मुझे अधिक स्पष्ट होना चाहिए था।
a_horse_with_no_name

ओरेकल (अन्य डेटाबेस से विपरीत) में ताले के लिए कोई साझा संरचना नहीं है। यह डेटाबेस को स्केलेबल बनाता है, लेकिन दूसरे हाथ में आप सभी ताले नहीं देख सकते हैं। सीधे डेटाबेस ब्लॉक में ताले जमा हो जाते हैं। उस क्षण में जब किसी को एक संरचना अवरुद्ध हो जाती है "धारक-वेटर" बनाया जाता है। फिर आप इस जोड़ी को देखेंगे V$LOCK
ibre5041

जवाबों:


13

आप वास्तव में उन सभी पंक्तियों को सूचीबद्ध नहीं कर सकते हैं जिन्हें एक सत्र द्वारा बंद किया जा रहा है । हालाँकि, एक बार एक सत्र को दूसरे द्वारा अवरुद्ध किया जा रहा है , आप पा सकते हैं कि कौन सा सत्र / पंक्ति इसे रोक रही है।

ओरेकल व्यक्तिगत पंक्ति ताले की एक सूची को बनाए नहीं रखता है। बल्कि, पंक्तियों को सीधे पंक्तियों के अंदर पंजीकृत किया जाता है - इसे एक अतिरिक्त स्तंभ के रूप में सोचें।

आप देख सकते हैं कि किस सत्र ने V$LOCKदृश्य के माध्यम से किसी ऑब्जेक्ट पर लॉक प्राप्त कर लिया है , लेकिन यह केवल सामान्य जानकारी को सूचीबद्ध करेगा, न कि पंक्ति स्तर पर।

इस दृष्टि से आप यह भी पा सकते हैं कि क्या कोई सत्र दूसरे द्वारा अवरुद्ध किया जा रहा है। उस स्थिति में, यदि किसी सत्र को दूसरे सत्र से अवरुद्ध किया जाता है, तो सूचना में पंक्ति जानकारी प्रदर्शित V$SESSIONहोती है।

आप पंक्ति को पुनः प्राप्त कर सकते हैं, चलो 2 सत्रों के साथ एक उदाहरण बनाते हैं:

SESSION1> create table test as select * from all_objects;

Table created

SESSION1> select rowid from test where object_name = 'TEST' for update;

ROWID
------------------
AAMnFEAAaAAALTDAAz

/* setting identifiers to help with identifying this session later */
SESSION2> exec dbms_application_info.set_client_info('012345');

PL/SQL procedure successfully completed

SESSION2> select 1 from test where object_name = 'TEST' for update;
/*  this will block */

सत्र 2 अब सत्र 1 पर इंतज़ार कर रहा है। हम इसके साथ अवरुद्ध पंक्ति की खोज कर सकते हैं :

SESSION1> SELECT o.object_name,
       2         dbms_rowid.ROWID_CREATE (1,
       3                                  s.ROW_WAIT_OBJ#,
       4                                  s.ROW_WAIT_FILE#,
       5                                  s.ROW_WAIT_BLOCK#,
       6                                  s.ROW_WAIT_ROW#) rid
       7     FROM dba_objects o, v$session s
       8    WHERE o.object_id = s.row_wait_obj#
       9      AND s.client_info = '012345';

OBJECT_NAME     RID
--------------- ------------------
TEST            AAMnFEAAaAAALTDAAz

आगे पढ़ने के लिए: टॉम Kyte द्वारा प्रक्रिया का विवरण


3

आप निम्नलिखित क्वेरी को चलाकर ओरेकल डेटाबेस में सभी तालिकाओं के ताले पा सकते हैं

select
   c.owner,
   c.object_name,
   c.object_type,
   b.sid,
   b.serial#,
   b.status,
   b.osuser,
   b.machine
from
   v$locked_object a ,
   v$session b,
   dba_objects c
where
   b.sid = a.session_id
and
   a.object_id = c.object_id;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.