Autocommit e Commit on Exit

giovedì 18 dicembre 2008 alle 18:44 | Pubblicato su SQL, Varie | 1 commento
Tag: , ,

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.

1 commento »

RSS feed for comments on this post. TrackBack URI

  1. 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).


Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Blog su WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: