Oggi doppio post, infatti oggi ho scoperto due cose nuove. Dopo la nuova procedura purge del package dbms_shared_pool di cui ho parlato nel post precedente adesso è il momento di un nuova cosa che ho scoperto grazie a questo thread di CDOS. Si tratta di un comportamento di SQL*Plus, ma più in generale di Oracle. Ne ha scritto Eddie Awads più di tre anni fa ma io credo di non essermene mai accorto.
SQLPlus all’uscita (tramite comando EXIT o DISC) fa un commit implicito. La documentazione lo specifica, ma chi è mai andato a vedere la descrizione del comando exit sul manuale? Chiaramente chi lavora con Oracle impara abbastanza presto che bisogna sempre fare dei commit impliciti o espliciti e così è stato per me. Se sono uscito da sqlplus senza fare commit o rollback espliciti è perché non avevo modificato dati importanti, quindi non ho mai verificato il comportamento e quindi non ho mai capito che all’uscita veniva fatto un commit esplicito.
Ero convinto che il comportamento fosse lo stesso di quando una sessione in qualche modo “crasha” ed oracle la ripulisce facendo il rollback. Non è così. Chiaramente, nei programmi a interfaccia grafica il problema non si pone. Ad esempio con SQL Developer all’uscita viene chiesto se committare o rollbackare (c’è anche una terza opzione che stronca brutalmente la connessione lasciando la sessione ed eventuali transazioni appese , ho provato e ne sconsiglio l’uso). In sqlplus invece la cosa è subdola.
Ho fatto anche un test con JDBC e con mia grande sorpresa (di nuovo) ho scoperto che anche qui il comportamento è lo stesso, come documentato la chiusura della connessione fa un commit implicito.
Questo comportamento si chiama (almeno credo) Commit on Exit. E’ diverso dal meccanismo chiamato autocommit che abilita il lancio di un commit automatico dopo ogni istruzione DML.
Postato in: SQL, Varie | Messo il tag: oracle, sql developer, sqlplus


Read Translated version of this blog 


In genere dovrebbe essere corretto chiudere il proprio lavoro sempre con un commit o un rollback esplicito.
Il “Commin On Exit” potrebbe generare qualche problema soprattutto quando si costruiscono script da lanciare in background. Ho ad esempio la brutta abitudine di scrivere cose del tipo:
sqlplus -s user/pwd << !
select * from dual;
!
In questo caso, il commit è implicito. Forse come giusta prassi di programmazione, andrebbe scritto qualcosa del tipo:
sqlplus -s user/pwd < EOF
;
;
commit;
;
commit;
exit rollback;
EOF
L’EXIT ROLLBACK è ovviamente ridondante, ma potrebbe servire per ricordarci di aver chiuso tutti gli statement preccedenti (soprattutto l’ultimo, visto che il commit finale conclude tutte le transazioni aperte).