Je cherche un moyen de savoir s'il existe des instructions INSERT, UPDATE ou DELETE non validées dans la session en cours. Une solution serait de vérifier v $ lock avec le sid actuel, mais cela nécessite un accès en lecture à v $ lock, ce qui pose problème si l'administrateur de base de données ne veut pas l'accorder. Tout autre moyen (autre que de garder une trace de toutes les commandes de base de données émises par l'application)?
vous pouvez vérifier si votre session a une ligne dans V$TRANSACTION
(cela nécessite évidemment le privilège de lecture sur cette vue):
SQL> SELECT COUNT(*)
2 FROM v$transaction t, v$session s, v$mystat m
3 WHERE t.ses_addr = s.saddr
4 AND s.sid = m.sid
5 AND ROWNUM = 1;
COUNT(*)
----------
0
SQL> insert into a values (1);
1 row inserted
SQL> SELECT COUNT(*)
2 FROM v$transaction t, v$session s, v$mystat m
3 WHERE t.ses_addr = s.saddr
4 AND s.sid = m.sid
5 AND ROWNUM = 1;
COUNT(*)
----------
1
SQL> commit;
Commit complete
SQL> SELECT COUNT(*)
2 FROM v$transaction t, v$session s, v$mystat m
3 WHERE t.ses_addr = s.saddr
4 AND s.sid = m.sid
5 AND ROWNUM = 1;
COUNT(*)
----------
0
C’est la requête que j’utilise normalement,
select s.sid
,s.serial#
,s.username
,s.machine
,s.status
,s.lockwait
,t.used_ublk
,t.used_urec
,t.start_time
from v$transaction t
inner join v$session s on t.addr = s.taddr;
SELECT * FROM V$TRANSACTION
WHERE STATUS='ACTIVE';
Voir: http://forums.Oracle.com/forums/thread.jspa?threadID=691061
Utilisez la requête ci-dessous pour connaître la transaction en attente.
S'il renvoie une valeur, cela signifie qu'une transaction est en attente.
Voici la requête:
select dbms_transaction.step_id from dual
;
Références:
http://www.acehints.com/2011/07/how-to-check-pending-transaction-in.htmlhttp://www.acehints.com/p/site- map.html
La solution la plus simple et la plus fiable consiste à essayer de démarrer une transaction et de voir si elle réussit. Si du code a déjà démarré une transaction mais n'a pas encore émis de DML, la vue V $ TRANSACTION ne montrera rien.
Dans cet exemple ci-dessous, je gère l'exception pour générer une erreur d'application définie par l'utilisateur. Pour reporter à un gestionnaire d'exceptions existant, il suffit de faire une SET TRANSACTION et ensuite COMMIT immédiatement pour l'annuler.
DECLARE
transaction_in_progress EXCEPTION;
PRAGMA EXCEPTION_INIT(transaction_in_progress, -1453);
BEGIN
SET TRANSACTION NAME 'CHECK_FOR_TRANSACTION_ALREADY_SET';
COMMIT; -- end transaction
EXCEPTION
WHEN transaction_in_progress THEN
RAISE_APPLICATION_ERROR(-20000,'Transaction is already in progress');
END;
/
Matthew Watson peut être modifié pour être utilisé dans RAC
select t.inst_id
,s.sid
,s.serial#
,s.username
,s.machine
,s.status
,s.lockwait
,t.used_ublk
,t.used_urec
,t.start_time
from gv$transaction t
inner join gv$session s on t.addr = s.taddr;