Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Warum erhalte ich eine offene Transaktion, wenn ich nur aus einer Datenbankansicht auswähle?

Entgegen Ihrer Erwartung sieht es so aus, als ob der Datenbanklink ist die Quelle der offenen Transaktion. Ich habe ein solches Verhalten schon früher bemerkt, wenn ich SELECT-Abfragen auf entfernten Tabellen in PL/SQL Developer ausgeführt habe.

Um Tom Kyte zu zitieren ( Quelle ):

BEARBEITEN :'Jede SQL-Anweisung startet eine Transaktion in Oracle'? Nein, tut es nicht, und hier ist eine Demonstration davon. Diese Demonstration verwendet die Datenwörterbuchansicht V$TRANSACTION , das die aktiven Transaktionen auflistet. Dies alles läuft auf meiner lokalen Oracle XE-Datenbank, mit der außer mir keine anderen Benutzer verbunden sind.

Wir verwenden die folgende Tabelle während dieser Demonstration. Es enthält nur eine einzige Spalte:

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

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

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

Derzeit keine aktiven Transaktionen. Lassen Sie uns eine SQL-Abfrage für diese Tabelle ausführen:

SQL> select * from test;

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

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

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

Noch keine aktiven Transaktionen. Lassen Sie uns nun etwas tun, das eine Transaktion startet:

SQL> insert into test values (1);

1 row created.

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

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

Wie erwartet haben wir jetzt eine aktive Transaktion.

SQL> commit;

Commit complete.

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

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

Nach dem Festschreiben der Transaktion ist sie nicht mehr aktiv.

Lassen Sie uns nun einen Datenbanklink erstellen. Ich verwende Oracle XE, und Folgendes erstellt einen Datenbanklink von meiner Oracle XE-Instanz zurück zu sich selbst:

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

Database link created.

Sehen wir uns nun an, was passiert, wenn wir aus der Tabelle über den Datenbanklink auswählen:

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

Wie Sie sehen können, öffnet eine einfache Auswahl aus einer entfernten Tabelle eine Transaktion.

Ich bin mir nicht sicher, was hier festgeschrieben oder rückgängig gemacht werden muss, aber ich muss zugeben, dass ich die Vor- und Nachteile verteilter Transaktionen nicht kenne, in denen die Antwort wahrscheinlich liegt.