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

Pourquoi est-ce que j'obtiens une transaction ouverte lorsque je sélectionne simplement dans une vue de base de données ?

Contrairement à vos attentes, il semble que le lien de la base de données est la source de la transaction ouverte. J'ai déjà remarqué un comportement comme celui-ci lors de l'exécution de requêtes SELECT sur des tables distantes dans PL/SQL Developer.

Pour citer Tom Kyte ( sources ):

MODIFIER :'Toute instruction SQL démarre une transaction dans Oracle' ? Non, ce n'est pas le cas, et en voici une démonstration. Cette démonstration utilise la vue du dictionnaire de données V$TRANSACTION , qui répertorie les transactions actives. Tout cela s'exécute sur ma base de données Oracle XE locale, à laquelle aucun autre utilisateur que moi n'est connecté.

Nous utiliserons le tableau suivant lors de cette démonstration. Il ne contient qu'une seule colonne :

test de description
SQL> desc test;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 A                                                  NUMBER(38)

SQL> select count(*) from v$transaction;

  COUNT(1)
----------
         0

Aucune transaction active pour le moment. Exécutons une requête SQL sur cette table :

SQL> select * from test;

         A
----------
         2

SQL> select count(*) from v$transaction;

  COUNT(1)
----------
         0

Toujours pas de transactions actives. Faisons maintenant quelque chose qui lancera une transaction :

SQL> insert into test values (1);

1 row created.

SQL> select count(*) from v$transaction;

  COUNT(1)
----------
         1

Comme prévu, nous avons maintenant une transaction active.

SQL> commit;

Commit complete.

SQL> select count(*) from v$transaction;

  COUNT(1)
----------
         0

Une fois la transaction validée, elle n'est plus active.

Maintenant, créons un lien de base de données. J'utilise Oracle XE et ce qui suit crée un lien de base de données depuis mon instance Oracle XE vers elle-même :

SQL> create database link loopback_xe connect to user identified by password using 'XE';

Database link created.

Voyons maintenant ce qui se passe lorsque nous sélectionnons dans le tableau via le lien de la base de données :

SQL> select count(*) from v$transaction;

  COUNT(1)
----------
         0

SQL> select * from [email protected]_xe;

         A
----------
         2
         1

SQL> select count(*) from v$transaction;

  COUNT(1)
----------
         1

Comme vous pouvez le constater, une simple sélection dans une table distante ouvre une transaction.

Je ne sais pas exactement ce qu'il y a à valider ou à annuler ici, mais je dois admettre que je ne connais pas les tenants et les aboutissants des transactions distribuées, dans lesquelles se trouve probablement la réponse.