Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Oracle nested transactions

Îåêßíçóå áðü ôï ìÝëïò Δημήτρης Μπούνδρης. Τελευταία δημοσίευση από το μέλος Δημήτρης Μπούνδρης στις 18-09-2007, 12:29. Υπάρχουν 1 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  17-09-2007, 17:59 35077

    Oracle nested transactions

    Έχω ένα PL/SQL procedure με πολλά DML statements. Στο exception handling γράφω

    EXCEPTION
    WHEN OTHERS THEN
    ROLLBACK;
    dbms_output.put_line('*************************************************');
    dbms_output.put_line('An Error has occured : ' || SQLERRM);

    EXIT;

    END;

    Έχω όμως 3 ερωτήσεις:

    1) Αφού η Oracle δεν υποστηρίζει nested transactions έχει νόημα να χρησιμοποιήσω rollback;

    2) Εάν ήθελα μέσα στο exception block να γράψω σε ένα Log πίνακα θα έπρεπε να κάνω μόνος rollback ολα τα προηγούμενα, να γράψω τα insert statements και να κλείσω explicitly το transaction? Η έχουν γίνει ήδη από πριν rollback τα πάντα?

    3) Όταν κλείνει το session γίνονται αυτόματα όλα commit;

     

     

     


    Dimitris Boundris
    Software Engineer
  •  18-09-2007, 12:29 35094 σε απάντηση της 35077

    Απ: Oracle nested transactions

    Ίσως επειδή το έψαξα λιγάκι παραπάνω βρήκα κάποιες πληροφορίες που ίσως σε κάποιους τους φανούν ενδιαφέρουσες:

    Η Oracle δεν υποστηρίζει nested transactions σε αντίθεση με τον SQL Server. Κάνει commit ή rollback όλα τα προηγούμενα statements και ανοίγει νέο transaction με την εκτέλεση του επόμενου statement.

    Όταν ένα statement προκαλέσει error τότε γίνεται rollback μόνο αυτό και όχι ότι έχει πριν από αυτό προηγηθεί.

    Στο exception block πρέπει explicitly να εκτελέσουμε commit ή rollback δίοτι μετα εξαρτάται από το περιβάλλον της Oracle database το τι θα αποφασίσει να γίνει. Βασικά εαν ο χρήστης επιλέξει έπειτα session disconnect τότε γίνεται commit, εαν κλείσει το session rollback κλπ.

    Εαν θέλουμε να εκτελέσουμε κάποια statements ενδιάμεσα σε ένα transaction που να μην σχετίζονται με αυτό και να μην το επηρεάζουν τότε θα πρέπει να χρησιμοποιήσουμε μια άλλη procedure που να είναι δηλωμένη ως PRAGMA AUTONOMOUS_TRANSACTION. Έτσι θα μπορεί να εκτελεστεί αυτή και να κάνει commit χωρίς να επηρεάζει το block μέσα από το οποίο αυτή καλείται.

     


    Dimitris Boundris
    Software Engineer
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems