Oracle'da bir kayıt kilitlendiğinde, hangi kaydın kilitlendiğini öğrenebilir miyiz?


10

Bir kayıt kilitlendiğinde hangisinin kilitlendiğini öğrenebilir miyiz?

Kaydı rowid veya başka bir bilgi nasıl alabilirim?


Bu sql tarafından biraz bilgi alabilirim

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(+) 

Web'de işlevi kullanarak rowid almak için bir yöntem buldum DBMS_ROWID.ROWID_CREATE()

Ama işe yaramıyor gibi görünüyor.


2
Bir işlem tarafından tutulan kilitleri değil, yalnızca bazı işlemlerin beklediği kilitleri görebilirsiniz.
a_horse_with_no_name

@a_horse_with_no_name - v $ kilidi size bir işlem tarafından tutulan kilitleri gösterir
Chris Saxon

@ChrisSaxon: Haklısın. Hangi satırların kilitlendiğini göremediğiniz gerçeğinden bahsediyordum - daha açık olmalıydım.
a_horse_with_no_name

Oracle'ın (diğer veritabanlarının aksine) kilitler için paylaşılan bir yapısı yoktur. Bu, veritabanını ölçeklendirilebilir hale getirir, ancak diğer yandan tüm kilitleri göremezsiniz. Kilitler doğrudan veritabanı bloklarında saklanır. Birinin bloke olduğu anda bir yapı "garson-garson" yaratılır. Sonra bu çifti göreceksiniz V$LOCK.
ibre5041

Yanıtlar:


13

Bir oturum tarafından kilitlenen tüm satırları gerçekten listeleyemezsiniz . Ancak, bir oturum başka biri tarafından engellendiğinde , hangi oturumun / satırın onu engellediğini bulabilirsiniz.

Oracle, tek tek satır kilitlerinin listesini tutmaz. Daha ziyade, kilitler doğrudan satırların içine kaydedilir - bunu ekstra bir sütun olarak düşünün.

Hangi oturumun bir nesne üzerinde kilit elde ettiğini V$LOCKgörünüm yoluyla bulabilirsiniz , ancak bu satır düzeyinde değil, yalnızca genel bilgileri listeler.

Bu görünümle, bir oturumun başka biri tarafından engellenip engellenmediğini de bulabilirsiniz. Bu durumda, bir oturum başka bir oturum tarafından engellenirse , satır bilgileri bilgide görüntülenir V$SESSION.

Rowid'i alabilirsiniz, 2 oturumla bir örnek oluşturalım:

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. Oturum şimdi 1. Oturumda bekliyor. Engelleme satırını aşağıdakilerle keşfedebiliriz :

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

Daha fazla okuma için: Tom Kyte'nin sürecinin açıklaması .


3

Bir Oracle veritabanındaki tüm tablo kilitlerini aşağıdaki sorguyu çalıştırarak bulabilirsiniz

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.