Έστω ότι έχεις ένα parent component που καλεί μία σειρά από άλλα components. Κάποια είναι wirters και κάποια readers.
To parent component έχει (ας πούμε) Required ή RequiresNew, οπότε με το καλημέρα ξεκινάει ένα transaction. Και ας πούμε ότι οι wirters έχουν Supported ενώ οι readers έχουν NotSupported. Όλα τα components είναι stateless, και όπου κάνεις access την βάση ανοίγεις ένα νέο connection (που στο δίνει από το pool), κάνεις αυτά που θες, και το κλείνεις όσο πιο γρήγορα μπορείς.
Με το παραπάνω "setup" μπορεί να αντιμετωπίσεις τα εξής 2 προβλήματα:
Πρόβλημα 1: [Ισως να το έχεις ήδη σκεφτεί, διότι μιλάς για reads που ΔΕΝ προηγούνται κάποιου insert/update.delete.] Γενικός κανόνας: αν μέσα σε ένα transaction χρησιμοποιείς πληροφορίες που παίρνεις από select (είτε για να παίρνεις αποφάσεις, είτε για να τις γράψεις σε άλλους πίνακες) τα select αυτά πρέπει να συμμετέχουν στο transaction, ούτως ώστε να διαβάζεις consistent πληροφορίες (τα λεγόμενα repeatable reads), και για να μην κάνεις τα data αχταρμά! Για παράδειγμα:
- Ξεκινάς το transaction "πώληση προϊόντος"
- Διαβάζεις το πεδίο "stock" εκτός transaction: 10 τεμάχια
- Κάνεις ότι κάνεις, και πας να κάνεις update στο stock με 9 (αφού πούλησες 1)
- Κάποιος άλλος έχει ήδη πουλήσει άλλα 2, οπότε στην βάση έχει 8.
- Εσύ γράφεις 9
- Γεια σας!
Αν όμως ο reader συμμετείχε στο transaction, με το που θα έκανε select, δεν θα μπορούσε κανείς να πειράξει αυτή την εγγραφή μέχρι να τελείωνε το transaction, οπότε και αν την ξαναδιάβαζες (πιο κάτω στον κώδικά σου) θα έβρισκες πάλι την τιμή 10, αλλά και αν πήγαινες να κάνεις update, δεν θα έσκιζες το consistency της βάσης σου.
Πρόβλημα 2 (πιο ωραίο!): Το parent component καλεί τα εξής: writer1, reader1, writer2 και τελειώνει. Ο writer1 κάνει update μία εγγραφή (έστω πάλι το stock), οπότε την κλειδώνει μέχρι να τελειώσει το transaction. Έρχεται ο reader1 (που είναι εκτός transaction), πάει να την διαβάσει και... την βρίσκει κλειδωμένη! Γεια σας! Έκανες το μαγικό deadlock με τον εαυτό σου!
Γενικά, λοιπόν, μου ακούγεται πολύ επικίνδυνο, άσε που δεν μπορώ να φανταστώ γιατί είναι χρήσιμο... Βέβαια, είναι και 3 το πρωί, οπότε το μυαλό μου δεν είναι και στα φόρτε του...
Patrick