web-dev-qa-db-fra.com

Oracle: Comment savoir s'il y a une transaction en attente?

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)?

29
Erich Kitzmueller

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
38
Vincent Malgrat

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;
29
Matthew Watson
SELECT * FROM V$TRANSACTION
WHERE STATUS='ACTIVE';

Voir: http://forums.Oracle.com/forums/thread.jspa?threadID=691061

8
Robert Durgin
4
cagcowboy

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

3
DBA

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;
/
1
Peter Nosko

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;
0
Vu Trong Trang