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

 

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

database transactions

Îåêßíçóå áðü ôï ìÝëïò DaltonGR. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 30-05-2012, 09:50. Υπάρχουν 1 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  30-05-2012, 09:19 70463

    database transactions

    Καλημέρα,
    Φτιάχνω μια εφαρμογή που θα την χρησιμοποιούν 4-5 χρήστες ταυτόχρονα. Σε μία συγκεκριμένη φόρμα καταχώρησης προβλήματος, όταν αυτή ανοίγει, θα ήθελα να δεσμέυεται το επόμενο κλειδί(ID), αυτόματη αρίθμηση, απο τον πίνακα και να τον εμφανίζει σε ένα textbox. Οταν συνδεθεί άλλος χρήστης να γίνεται το ίδιο και σε αυτόν με τον επόμενο και όχι με τον ίδιο αριθμό. Είναι αυτό δυνατόν ή θα πρέπει να βρώ κάποιο workaround?

    Ευχαριστώ εκ των προτέρων.
  •  30-05-2012, 09:50 70464 σε απάντηση της 70463

    Απ: database transactions

    Γιατί θέλεις να κάνεις κάτι τέτοιο? 

    Αν θέλεις μοναδική αρίθμηση απλά για να έχεις unique primary key μπορείς να ορίσεις ότι το πεδίο ID είναι IDENTITY ή Auto-increment. Κάθε βάση το λέει διαφορετικά αλλά όλες έχουν αυτό το feature. Αν μιλάμε για primary key όμως δεν υπάρχει λόγος να περιοριστείς σε αυξανόμενα integer κλειδιά. Μπορείς άνετα να δημιουργήσεις ένα unique κλειδί στον client και να γλυτώσεις ένα round-trip στη βάση. Μία πρόχειρη λύση είναι να χρησιμοποιήσεις GUIDs, ενώ πολλά ORMs δημιουργούν integer IDs στον client χρησιμοποιώντας αλγόριθμους όπως ο HiLo: το high word του κλειδιού είναι μοναδικά για κάθε client ενώ το low word είναι αυξανόμενο. 

    Αν θέλεις για κάποιο λόγο να εμφανίζεις ένα νούμερο στο χρήστη, π.χ. αυξανόμενο αριθμό πρωτοκόλλου, αυτός ΔΕΝ πρέπει να είναι το primary key. Γενικά είναι κακή ιδέα να χρησιμοποιείς το primary key για business λόγους. Ειδικά για το primary key, αν προσπαθήσεις να επιβάλεις κλειδώματα στην ουσία κλειδώνεις ολόκληρο τον πίνακα, μία πολύ κακή ιδέα. Επιπλέον, αναγκάζεσαι να περιορίσεις τον κώδικα σου να χρησιμοποιήσει μία μορφή κλειδιού που μπορεί να μην ταιριάζει - προφανώς δεν μπορείς να χρησιμοποιήσεις HiLo αν πρέπει να δείξεις την τιμή στους clients.

    Σε αυτή την περίπτωση μπορείς να χρησιμοποιήσεις τα sequences που δίνουν βάσεις όπως ο  SQL Server, η Oracle, η Postgres και στην ουσία κάνουν αυτό που ζητάς: δίνουν ένα μοναδικό αυξανόμενο αριθμό σε όποιον τον ζητήσει, μέσα στα πλαίσια ενός transaction. Αν το transaction αποτύχει, ο αριθμός είναι διαθέσιμος στον επόμενο. Η υλοποίηση των sequences είναι τέτοια ώστε να μην προκαλούν σοβαρά κλειδώματα.

    Σε βάσεις όπως η MySQL που δεν έχουν sequences μπορείς να κάνεις κάτι παρόμοιο φτιάχνοντας ένα πίνακα με το όνομα κάθε sequence και την τελευταία τιμή του. Όποιος θέλει να πάρει νέο αριθμό θα πρέπει να καλεί ένα συγκεκριμένο stored procedure το οποίο θα αυξάνει κατά ένα την τιμή και θα την επιστρέφει, όπως πχ. εδώ

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems