sql >> Database teknologi >  >> RDS >> Oracle

Hvorfor får jeg en åben transaktion, når jeg bare vælger fra en databasevisning?

I modsætning til din forventning ser det ud til, at databaselinket er kilden til den åbne transaktion. Jeg har bemærket adfærd som denne før, når jeg kører SELECT-forespørgsler på eksterne tabeller i PL/SQL Developer.

For at citere Tom Kyte ( kilde ):

REDIGER :'Enhver SQL-sætning starter en transaktion i Oracle'? Nej, det gør det ikke, og her er en demonstration af det. Denne demonstration bruger dataordbogsvisningen V$TRANSACTION , som viser de aktive transaktioner. Det hele kører på min lokale Oracle XE-database, som ikke har andre brugere end mig tilsluttet.

Vi vil bruge følgende tabel under denne demonstration. Den indeholder kun en enkelt kolonne:

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

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

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

Ingen aktive transaktioner i øjeblikket. Lad os køre en SQL-forespørgsel mod denne tabel:

SQL> select * from test;

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

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

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

Stadig ingen aktive transaktioner. Lad os nu gøre noget, der vil starte en transaktion:

SQL> insert into test values (1);

1 row created.

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

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

Som forventet har vi nu en aktiv transaktion.

SQL> commit;

Commit complete.

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

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

Efter at have begået transaktionen, er den ikke længere aktiv.

Lad os nu oprette et databaselink. Jeg bruger Oracle XE, og følgende opretter et databaselink fra min Oracle XE-instans tilbage til sig selv:

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

Database link created.

Lad os nu se, hvad der sker, når vi vælger fra tabellen over databaselinket:

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

Som du kan se, åbnes en transaktion blot ved at vælge fra en ekstern tabel.

Jeg er ikke sikker på præcis, hvad der er at forpligte sig eller rulle tilbage her, men jeg må indrømme, at jeg ikke kender ins og outs af distribuerede transaktioner, hvori svaret sandsynligvis ligger.



  1. Vil du migrere eksisterende auth.Brugerdata til den nye Django 1.5 brugermodel?

  2. Sådan gendannes tilliden til en fremmednøglebegrænsning i SQL Server (T-SQL-eksempler)

  3. Hvordan kan jeg oprette en begrænsning for at kontrollere, om en e-mail er gyldig i postgres?

  4. Hvad er DBMS? – En omfattende guide til databasestyringssystemer