Domanda

Se eseguo una semplice dichiarazione prescelta in PL / SQL Developer contro una tabella di database, ottengo un set standard di risultati indietro come mi sarei aspettato.

Di recente, ho incollato una query da una stored procedure che è accaduto per selezionare da una vista, e ho notato che una transazione è stata apparentemente lasciata aperta. Questo è stato appraent dal rollback e commit opzioni erano disponibili in Developer PL / SQL.

Un sondaggio di altri sviluppatori ha rivelato che questo sembra interessare alcuni ma non altri, che mi portano a sospettare Impostazioni sviluppatore PL / SQL.

Perché mai essere questo il caso? La vista itelf ha una DBLink in un altro database, ma io non ci si aspetterebbe questo per avere alcun effetto.

Qualche idea?

È stato utile?

Soluzione

Qualsiasi istruzione SQL avvia una transazione in Oracle.

Dal manuale:

Una transazione inizia con la prima istruzione SQL eseguibile. A fini di transazione quando è commit o il rollback, sia esplicitamente con un'istruzione COMMIT o ROLLBACK o implicitamente quando un'istruzione DDL viene emesso. [...] Un eseguibile istruzione SQL è un'istruzione SQL che genera chiamate a un'istanza, tra cui istruzioni DML e DDL

La maggior parte probabilmente coloro che non sono seing questo sono in esecuzione in modalità in cui l'operazione avviata da una dichiarazione è immediatamente impegnata dopo l'istruzione ha finito di auto-commit.

Altri hanno sostenuto che un SELECT non è DML, ma ancora una volta manuale afferma chiaramente :

Data Manipulation Language (DML) interrogazione dichiarazioni o manipolare i dati in oggetti dello schema esistenti. Essi consentono di:

* Recupera o recuperare i dati da una o più tabelle o viste (SELECT)
* Aggiungere nuove righe di dati in un (INSERT)
tabella o vista [...]

Altri suggerimenti

Contrariamente alle vostre aspettative, sembra che il database link è la fonte della transazione aperta. Ho notato un comportamento del genere prima durante l'esecuzione di query SELECT su tabelle remote in PL / SQL Developer.

Per citare Tom Kyte ( ):

roba distribuito avvia una transazione "just in case".

Modifica : 'Qualsiasi istruzione SQL avvia una transazione in Oracle'? No, non è così, ed ecco una dimostrazione di esso. Questa dimostrazione utilizza la vista del dizionario dati V $ operazione, che elenca i transazioni attive. Tutto questo è in esecuzione sul mio database locale Oracle XE, che non ha altro da me ad esso collegati gli utenti.

useremo la seguente tabella durante questa dimostrazione. Esso contiene solo una singola colonna:

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

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

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

Non ci sono transazioni attive al momento. Corriamo una query SQL contro questa tabella:

SQL> select * from test;

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

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

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

Ancora nessuna transazioni attive. Ora facciamo qualcosa che possa avviare 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 commesso l'operazione, non è più attiva.

Ora, creiamo un database link. Sto utilizzando Oracle XE, e la seguente crea un collegamento a database dal mio Oracle XE esempio a se stesso:

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

Database link created.

Ora vediamo cosa succede quando si seleziona dalla tabella sopra il database link:

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

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

SQL> select * from test@loopback_xe;

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

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

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

Come si può vedere, semplicemente selezionando da una tabella remota apre una transazione.

Non so esattamente che cosa ci sia di commettere o rollback qui, ma devo ammettere di non conoscere gli angoli più riposti di transazioni distribuite, all'interno del quale la risposta risiede probabilmente.

È assolutamente non può aprire una transazione strettamente con una query normale. Si può aprire uno attraverso un collegamento di database. Il ragazzo che ha postato un link ai medici deliberatamente o del tutto incautamente lasciato fuori la frase 2 °.

"Una transazione in Oracle Database inizia quando il primo SQL eseguibile si incontra dichiarazione. Un'istruzione SQL eseguibile è uno SQL dichiarazione che genera chiamate a un'istanza, tra cui DML e DDL dichiarazioni ".

SELECT è né un DML, né un DDL. E 'anche banale per testare in realtà questo. Non voglio venire fuori come un troll qui, ma la sua davvero fastidioso quando la gente semplicemente buttare le risposte su un forum per cercare di ottenere i punti e le risposte sono complete spazzatura.

Leggi il resto del doc e TEST prima.

  • login a una sessione
  • eseguire un selezionato
  • vedere se si dispone di una transazione aperta unendo v$Session (per la sessione) per v$transaction.

Se un record torna, si dispone di una transazione. In caso contrario, non lo fai.

Nota, secondo il Oracle 11g Admin Guida , se si fa una pianura vecchio SELEZIONA attraverso un collegamento di database si inizierà una transazione, che deve essere impegnato (o rollback).

Select è una parte di un solo DML, ma blocco non viene acquisito, un blocco di riga viene prelevata al momento di inserimento / aggiornamento / cancellare / selezionare per l'aggiornamento. -Ross è giusto.

https://docs.oracle.com /cd/E11882_01/server.112/e41084/ap_locks001.htm#SQLRF55502

                        ROW Lock    Table lock

SELECT ... FROM Tabella ... ----- Nessuno

Tavolo INSERT INTO ... Sì SX

Lo stesso con l'aggiornamento cancellare e selezionare per l'aggiornamento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top