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

 

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

.netFramework 2.0 Transactions και TransactionScope

Îåêßíçóå áðü ôï ìÝëïò pontifikas. Τελευταία δημοσίευση από το μέλος pontifikas στις 09-05-2006, 20:30. Υπάρχουν 12 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  05-05-2006, 11:06 12320

    .netFramework 2.0 Transactions και TransactionScope

    Ακολουθόντας τις προτροπές του MSDN επιχείρησα να δοκιμάσω τα διαβόητα nested transactions κάνοντας χρήση του ακόλουθου:
    using (TransactionScope scope1 = new TransactionScope())
                {
                    SqlCommand cmd1 = new SqlCommand(mStr1, sqlConnection1);
                    cmd1.ExecuteNonQuery();
                    using (TransactionScope scope2 = new TransactionScope(TransactionScopeOption.Suppress))
                    {
                        SqlCommand cmd2 = new SqlCommand(mStr2, sqlConnection1);
                        cmd2.ExecuteNonQuery();
                        scope2.Complete();
                    }
                    scope1.Complete();
                }



    Θεωρείστε ότι το Connection γίνεται initialized ορθώς.Το mStr είναι ένα update command.

    Λοιπόν.Με βάση το manual( ή της δικής μου αντίληψης για αυτά που λέει), εάν δεν εκτελέσω το scope2.Complete()(βάλω κάποιο σχόλιο) τότε το upadate δεν θα εκτελεστεί.Θα εκτελεστεί όμως αυτό μέσα στο scope 1.
    Η ερώτηση μου είναι γιατί εκτελείται και στα 2 scopes. Γενικά το παραπάνω κομμάτι κώδικα δείχνει να εκτελεί τα updates ότι και να γίνει(έχω δοκιμάσει να δημιουργήσω exceptions καθώς και να μην καλέσω τα Complete().Huh? [:^)]
  •  05-05-2006, 23:03 12337 σε απάντηση της 12320

    Απ: .netFramework 2.0 Transactions και TransactionScope

    Δεν έχω καταλάβει ακριβώς την ερώτηση που θέτεις στο τέλος, ωστόσο ας τα πιάσουμε λίγο από την αρχή.

    To TransactionScopeOption.Suppress υποδηλώνει ότι ο contained κώδικας δεν συμμετέχει ως τμήμα κανενός transaction και διαθέτει δικό του μηχανισμό compensation (δηλαδή είναι custom οι ενέργειες που θα γίνονται στο rollback - πχ. αν το action είναι η απoστολή ενός e-mail, το compensation action είναι η αποστολή ενός νέου που θα λέει "παρακαλώ αγνοήστε το προηγούμενο"). Για να πούμε τι κάνει με πιο απλά λόγια, στο τρέχον transaction ανοίγει μια παρένθεση και εκτελεί ένα άλλο που δεν σχετίζεται με το εξωτερικό. Βασικά, δεν έχει πολύ νόημα η χρήση του...

    Επίσης να πούμε ότι το Complete δεν είναι commit. Με το Complete, δηλώνεις ότι έχει ολοκληρωθεί η εκτέλεση των statements του transaction και κατόπιν θα επακολουθήσει το commit από τον transaction manager. Δεν υπάρχει όμως καμιά εγγύηση ότι το commit θα επιτύχει.

    Άρα λοιπόν τα δύο scopes στον κώδικά σου είναι άσχετα και ορθώς το update του scope1 εκτελείται άσχετα με το τι θα συμβεί στο scope2. Κατόπιν, υπάρχει κάποιο άλλο πρόβλημα;


    Vir prudens non contra ventum mingit
  •  07-05-2006, 18:00 12364 σε απάντηση της 12320

    Smile [:)] Απ: .netFramework 2.0 Transactions και TransactionScope

    Δεν καταλαβαίνω γιατί κάποιος πρέπει να χρησιμοποιήσει 2 transaction scopes? Σκοπός του transaction scope είναι να λειτουργήσει ως ομπρέλλα για τα transactions που θα βάλουμε να εκτελεσθούν μέσα σε αυτό. Όπως για παράδειγμα αν έχουμε transactions σε μία ή περισσότερες βάσεις δεδομένων (distributed transactions). Άρα το transaction scope παραμένει ένα και μέσα σε αυτό τοποθετούμε τα database transactions (commands) που θέλουμε να εκτελεσθούν μέσα σε ένα transaction.

    Ελπίζω να βοήθησα ...

     


    Βαγγέλης Ξανθάκης
    Independent Consultant
    www.aylos.com
  •  07-05-2006, 18:22 12367 σε απάντηση της 12364

    Απ: .netFramework 2.0 Transactions και TransactionScope

    Ο μηχανισμός των Transactions (μιλάμε πάντοτε για το System.Transaction namespace) βασίζεται στα exceptions για να καθορίσει αν η οποιαδήποτε ενέργεια είναι επιτυχής ή όχι. Άρα λοιπόν, καμιά φορά μπορεί να θέλουμε τα exceptions από τα downlevel functions να μην επηρεάσουν το outer transaction όποτε τότε χρησιμοποιούμε νέο TransactionScope με RequiresNew ή Suppress option (πχ μπορεί να έχουμε υλοποιήσει κάποια λογική τύπου "retry-on-fail" για ένα από τα βήματα του transaction).


    Vir prudens non contra ventum mingit
  •  07-05-2006, 18:51 12369 σε απάντηση της 12367

    Smile [:)] Απ: .netFramework 2.0 Transactions και TransactionScope

    Δεν μου έχει τύχει ποτέ να υλοποιήσω ποτέ κάποια λογική τύπου retry-on-fail πάντως σαφώς το requires new είναι ένα νέο transaction ανεξάρτητο από το πρώτο όσο γνωρίζω έως τη στιγμή που εμφανίστηκε το TransactionScope στο .ΝΕΤ 2.0 το suppress option δε το έχω μελετήσει ... αλλά θα το μελετήσω με τη πρώτη ευκαιρία. Γενικά πάντως η νομίζω ότι όταν κανείς σχεδιάζει τέτοια πράγματα (και ειδικά για μεγάλες εφαρμογές) πρέπει να σχεδιάζει απλά και σίγουρα. Άρα θέλω να καταλήξω ένα TransactionScope το οποίο θα κάνει όλη τη δουλειά ... στις περισσότερες των περιπτώσεων.

     


    Βαγγέλης Ξανθάκης
    Independent Consultant
    www.aylos.com
  •  08-05-2006, 08:30 12376 σε απάντηση της 12337

    Απ: .netFramework 2.0 Transactions και TransactionScope

     KelMan wrote:

    Επίσης να πούμε ότι το Complete δεν είναι commit. Με το Complete, δηλώνεις ότι έχει ολοκληρωθεί η εκτέλεση των statements του transaction και κατόπιν θα επακολουθήσει το commit από τον transaction manager. Δεν υπάρχει όμως καμιά εγγύηση ότι το commit θα επιτύχει.

    Άρα λοιπόν τα δύο scopes στον κώδικά σου είναι άσχετα και ορθώς το update του scope1 εκτελείται άσχετα με το τι θα συμβεί στο scope2. Κατόπιν, υπάρχει κάποιο άλλο πρόβλημα;



    Βασικά το θέμα είναι ότι περίμενα το Complete να είναι Commit. Στο msdn λέει ότι αν απουσιάζει, τότε ο transaction manager ρίχνει Exception. Οπότε λογικά θα κάνει rollback. Και όμως δεν κάνει.Δοκίμασα να βάλω τα complete σε σχόλιο, και τα transactions εκτελέστικαν κανονικά.
    Επίσης δοκίμασα να δημιουργήσω μόνος μου κάποιο exception μετά τα Updates προκειμένου να γίνει rollback, αλλά δεν έγινε.Τα updates εκτελούνται κανονικά.

    Πώς είναι δυνατόν να κάνω rollback Σε αυτά τα transactions????
  •  09-05-2006, 13:43 12438 σε απάντηση της 12320

    Απ: .netFramework 2.0 Transactions και TransactionScope

    Παραθέτω το κείμενο από το MSDN

    "If no exception occurs within the transaction scope (that is, between the initialization of the TransactionScope object and the calling of its Dispose method), then the transaction in which the scope participates is allowed to proceed. If an exception does occur within the transaction scope, the transaction in which it participates will be rolled back."

    Άρα αν κτυπήσει κάποιο exception τότε θα έχεις rollback. Πάντως αν δεν χρέιάζεσαι distributed transactions δεν υπάρχει λόγος να χρησιμοποιήσεις το TransactionScope. Μπορείς να χρησιμοποιήσεις τα transactions του Data Provider.


    Βαγγέλης Ξανθάκης
    Independent Consultant
    www.aylos.com
  •  09-05-2006, 13:57 12440 σε απάντηση της 12438

    Απ: .netFramework 2.0 Transactions και TransactionScope

    Να προσθέσω επίσης το παρακάτω url για όσους θέλουν να επεκταθούν περισσότερο

    http://www.microsoft.com/downloads/details.aspx?FamilyId=AAC3D722-444C-4E27-8B2E-C6157ED16B15&displaylang=en
    Βαγγέλης Ξανθάκης
    Independent Consultant
    www.aylos.com
  •  09-05-2006, 14:49 12446 σε απάντηση της 12440

    Απ: .netFramework 2.0 Transactions και TransactionScope

    Βαγγέλη δεν έχεις άδικο σε αυτά που λες, πράγματι το Systems.Transactions φτιάχτηκε προκειμένου να μπορέσουν οι προγραμματιστές να υλοποιούν distributed transactions χωρίς να καταφεύγουν στα Enterprise Services.

    Ωστόσο... τρώγοντας έρχεται η όρεξη και πλέον οι μοντέρνες εφαρμογές αρχίζουν να εκμεταλλεύονται τη λογική των transactions συμπεριλαμβάνοντας μέσα όχι μόνο database resource managers αλλά και άλλους όπως queue managers, messaging managers ή ακόμη και το file system (απ'οσο ξέρω το νέο file system θα υποστηρίζει transactions). Εξάλλου, το System.Transactions είναι έτσι φτιαγμένο (υποστηρίζει promotable transactions) που σημαίνει ότι όταν δουλεύει σε "local transaction mode" χρησιμοποιεί έναν lightweight transaction manager και δεν καταναλώνει τα resources που καταναλώνει ένα distributed transaction. Για την ακρίβεια ένα transaction από το System.Transaction μπορεί να περάσει από πολλαπλά επίπεδα ανάλογα με την πολυπλοκότητα του transaction και τους resource managers που λαμβάνουμε μέρος στο παιχνίδι. Μάλιστα, στον SQL Server 2005 ένα local transaction που το χειρίζεται το Systems.Transactions (και όχι το MSDTC) δεν επιφέρει κανένα performance hint!


    Vir prudens non contra ventum mingit
  •  09-05-2006, 14:56 12447 σε απάντηση της 12446

    Απ: .netFramework 2.0 Transactions και TransactionScope

    Μάνο συμφωνώ και προσυπογράφω όλα όσα αναφέρεις


    Βαγγέλης Ξανθάκης
    Independent Consultant
    www.aylos.com
  •  09-05-2006, 20:16 12460 σε απάντηση της 12438

    Απ: .netFramework 2.0 Transactions και TransactionScope

     vxan wrote:
    Παραθέτω το κείμενο από το MSDN

    "If no exception occurs within the transaction scope (that is, between the initialization of the TransactionScope object and the calling of its Dispose method), then the transaction in which the scope participates is allowed to proceed. If an exception does occur within the transaction scope, the transaction in which it participates will be rolled back."

    Άρα αν κτυπήσει κάποιο exception τότε θα έχεις rollback. Πάντως αν δεν χρέιάζεσαι distributed transactions δεν υπάρχει λόγος να χρησιμοποιήσεις το TransactionScope. Μπορείς να χρησιμοποιήσεις τα transactions του Data Provider.


    Επαναλαμβάνω ότι παρόλο που σηκώνω exception μέσα στο scope(μετά το executeNonQuery) ΔΕΝ κάνει rollback. Το update command που όρισα εκτελείται κανονικότα.
    Μήπως είναι άλλη η χρησιμότητα του scope???
  •  09-05-2006, 20:27 12461 σε απάντηση της 12460

    Απ: .netFramework 2.0 Transactions και TransactionScope

    Μπορείς να βάλεις το νέο κώδικα που προκύπτει ???
    Βαγγέλης Ξανθάκης
    Independent Consultant
    www.aylos.com
  •  09-05-2006, 20:30 12462 σε απάντηση της 12461

    Απ: .netFramework 2.0 Transactions και TransactionScope

    Αυτήν την στιγμή όχι.Αύριο το μεσημεράκι θα το ξαναδοκιμάσω και θα το δούμε Wink [;)]
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems