Oracle
 sql >> Base de données >  >> RDS >> Oracle

Un déclencheur peut-il être verrouillé ? comment déterminerait-on que c'est le cas ?

Pour déterminer si un déclencheur (ainsi que toute autre procédure stockée) est verrouillé ou non, le V$ACCESS la vue dynamique des performances peut être interrogée.

Session #1

insert into test_trigger
 select level
   from dual
connect by level <= 1000000; 

Session #2

SQL> select *
  2    from v$access
  3   where object = upper('test_trigger_t')
  4  ;


Sid  Owner  Object         Type    Con_Id 
--------------------------------------
441  HR     TEST_TRIGGER_T TRIGGER  3 

Ces types de verrous sont des broches de cache de bibliothèque (les verrous de cache de bibliothèque sont des ressources (TM type de verrou) verrous), nécessaires pour s'assurer qu'un objet est protégé contre la modification pendant que la session l'exécute.

--session sid # 441
insert into test_trigger
  select level
    from dual
 connect by level <= 1000000;


-- session sid #24
create or replace trigger test_trigger_t 
after insert on test_trigger for each row
begin
  insert into test_trigger_h (id) values (:new.id);
end;  

-- Session # 3
select vs.sid
     , vs.username
     , vw.event
  from v$session       vs
  join v$session_wait  vw
    on (vw.sid = vs.sid)
  join v$access        va
    on (va.owner = vs.username)
 where vs.username = 'HR'

Résultat :

Sid Username Event 
--------------------------
24 HR library cache pin 
....
441 HR log file switch (checkpoint incomplete) 

Ici, nous pouvons voir que la session #441 attend un changement de fichier journal et la session #24 attend la broche de cache de la bibliothèque.