Bonjour,
J'ai créé une procédure qui permet d'enregistrer des informations concernant les interbloquages dans une base de données.
Je créé tout d'abord une table pour stocker mes informations:
Ensuite je crée une procédure autonome, cette procédure doit enregistrer les informations de l'interbloquage dans une table:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 create table report_deadlock( lock_date VARCHAR2(30), wa_waiting_session NUMBER, wa_username VARCHAR2(30), wa_lock_type VARCHAR2(26), wa_sql_id VARCHAR2(13), wa_sql_text VARCHAR2(1000), ho_holding_session NUMBER, ho_username VARCHAR2(30), ho_lock_type VARCHAR2(26), ho_sql_id VARCHAR2(13), ho_sql_text VARCHAR2(1000));
Puis je crée un trigger
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 CREATE OR REPLACE PROCEDURE insert_report_deadlock IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO report_deadlock(lock_date, wa_waiting_session, wa_username, wa_lock_type, wa_sql_id, wa_sql_text, ho_holding_session, ho_username, ho_lock_type, ho_sql_id, ho_sql_text) select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS'), wa_dba_waiters.WAITING_SESSION, wa_v$session.USERNAME, wa_dba_waiters.LOCK_TYPE, wa_v$sqlarea.SQL_ID, wa_v$sqlarea.sql_text, ho_dba_waiters.HOLDING_SESSION, ho_v$session.USERNAME, ho_dba_waiters.LOCK_TYPE, ho_v$sqlarea.SQL_ID, ho_v$sqlarea.sql_text from dba_waiters wa_dba_waiters, v$session wa_v$session, v$sqlarea wa_v$sqlarea, dba_waiters ho_dba_waiters, v$session ho_v$session, v$sqlarea ho_v$sqlarea where wa_dba_waiters.waiting_session=wa_v$session.sid and wa_v$session.sql_address=wa_v$sqlarea.address and ho_dba_waiters.holding_session=ho_v$session.sid and ho_v$session.sql_address=ho_v$sqlarea.address; COMMIT; END insert_report_deadlock;
J'ai vérifié en provoquant un interbloquage et en exécutant mon "INSERT" qui est dans la procédure, les valeurs sont bien insérées dans la tables:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 CREATE OR REPLACE TRIGGER report_deadlock_trigger AFTER SERVERERROR ON DATABASE BEGIN IF (IS_SERVERERROR (60)) THEN sys.insert_report_deadlock; END IF; END report_deadlock_trigger;
J'ai vérifier que le trigger se déclenche bien lorsque je provoque un interbloquage en modifiant le corps de ma procédure par:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 INSERT INTO report_deadlock(lock_date, wa_waiting_session, wa_username, wa_lock_type, wa_sql_id, wa_sql_text, ho_holding_session, ho_username, ho_lock_type, ho_sql_id, ho_sql_text) select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS'), wa_dba_waiters.WAITING_SESSION, wa_v$session.USERNAME, wa_dba_waiters.LOCK_TYPE, wa_v$sqlarea.SQL_ID, wa_v$sqlarea.sql_text, ho_dba_waiters.HOLDING_SESSION, ho_v$session.USERNAME, ho_dba_waiters.LOCK_TYPE, ho_v$sqlarea.SQL_ID, ho_v$sqlarea.sql_text from dba_waiters wa_dba_waiters, v$session wa_v$session, v$sqlarea wa_v$sqlarea, dba_waiters ho_dba_waiters, v$session ho_v$session, v$sqlarea ho_v$sqlarea where wa_dba_waiters.waiting_session=wa_v$session.sid and wa_v$session.sql_address=wa_v$sqlarea.address and ho_dba_waiters.holding_session=ho_v$session.sid and ho_v$session.sql_address=ho_v$sqlarea.address;
Je retrouve bien ma valeur insérée. Pourquoi es ce que je n'ai rien dans ma table "report_deadlock" lorsque je laisse le trigger se déclencher pour logger les informations sur les interbloquages????
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 insert into test(col1) values ('bibaboomm');
Partager