it-swarm-eu.dev

Když je v systému Oracle uzamčen záznam, můžeme vědět, který záznam je uzamčen?

Když je záznam uzamčen, můžeme vědět, který je uzamčen?

Jak mohu získat záznam rowid nebo něco jiného info?


Tímto sql mohu získat nějaké informace

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

Našel jsem na webu metodu, jak získat rowid pomocí funkce DBMS_ROWID.ROWID_CREATE()

Zdá se však, že to nefunguje.

10
iafanda

Opravdu nemůžete uvést všechny řádky, které jsou uzamčeny relací. Jakmile je však relace blokována jinou, můžete zjistit, která relace/řádek ji blokuje.

Společnost Oracle neudržuje seznam jednotlivých zámků řádků. Spíše se zámky registrují přímo uvnitř samotných řádků - považujte to za zvláštní sloupec.

Můžete zjistit, která relace získala zámek na objektu pomocí V$LOCK zobrazení, ale zobrazí se pouze obecné informace, nikoli na úrovni řádku.

V tomto zobrazení můžete také zjistit, zda je relace blokována jinou. V takovém případě, pokud je relace blokována jinou relací, informace o řádku se zobrazí v V$SESSION informace.

Můžete načíst rowid, vytvořme příklad se 2 relacemi:

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 */

Sekce 2 nyní čeká na Session 1. Můžeme objevit blokovací řádek s:

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

K dalšímu čtení: popis procesu Tomem Kyteem .

13
Vincent Malgrat

Všechny zámky tabulek najdete v databázi Oracle spuštěním následujícího dotazu

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;
3
Baji Shaik