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

Perché ottengo una transazione aperta quando seleziono semplicemente da una vista del database?

Contrariamente alle tue aspettative, sembra che il collegamento al database sia la fonte della transazione aperta. Ho notato un comportamento come questo prima durante l'esecuzione di query SELECT su tabelle remote in PL/SQL Developer.

Per citare Tom Kyte ( fonte ):

MODIFICA :'Qualsiasi istruzione SQL avvia una transazione in Oracle'? No, non è così, ed eccone una dimostrazione. Questa dimostrazione utilizza la vista del dizionario dei dati V$TRANSACTION , che elenca le transazioni attive. Tutto questo è in esecuzione sul mio database Oracle XE locale, a cui non sono collegati altri utenti oltre a me.

Utilizzeremo la tabella seguente durante questa dimostrazione. Contiene solo una singola colonna:

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

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

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

Nessuna transazione attiva al momento. Eseguiamo una query SQL su questa tabella:

SQL> select * from test;

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

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

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

Ancora nessuna transazione attiva. Ora facciamo qualcosa che avvierà una transazione:

SQL> insert into test values (1);

1 row created.

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

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

Come previsto, ora abbiamo una transazione attiva.

SQL> commit;

Commit complete.

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

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

Dopo aver eseguito il commit della transazione, questa non è più attiva.

Ora creiamo un collegamento al database. Sto usando Oracle XE e quanto segue crea un collegamento al database dalla mia istanza Oracle XE a se stessa:

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

Database link created.

Ora vediamo cosa succede quando selezioniamo dalla tabella il collegamento al database:

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

Come puoi vedere, semplicemente selezionando da un tavolo remoto si apre una transazione.

Non sono sicuro di cosa ci sia da impegnare o ripristinare qui, ma devo ammettere di non conoscere i dettagli delle transazioni distribuite, all'interno delle quali probabilmente si trova la risposta.