εγγραφές της βάσης δεδομένων επεξεργασία από πολλούς χρήστες

ψήφοι
23

Έχω σχεδιάσει πίνακες της βάσης δεδομένων (κανονικοποιημένη, σε ένα διακομιστή MS SQL) και δημιούργησε ένα αυτόνομο παράθυρα καταλήγουν μπροστά για μια εφαρμογή που θα χρησιμοποιείται από μια χούφτα των χρηστών για να προσθέσετε και να επεξεργαστείτε τις πληροφορίες. Εμείς θα προσθέσει μια διαδικτυακή διεπαφή για να επιτρέψει την αναζήτηση απέναντι ζώνη παραγωγής μας σε μεταγενέστερη ημερομηνία.

Ανησυχώ ότι αν δύο χρήστες να ξεκινήσει την επεξεργασία το ίδιο αρχείο, στη συνέχεια, την τελευταία να δεσμεύει την ενημέρωση θα είναι ο «νικητής» και σημαντικές πληροφορίες μπορεί να χαθούν. Μια σειρά από λύσεις που έρχονται στο μυαλό, αλλά δεν είμαι σίγουρος αν εγώ είμαι πρόκειται να δημιουργήσει ένα μεγαλύτερο πονοκέφαλο.

  1. Μην κάνετε τίποτα και ελπίζω ότι δύο χρήστες δεν πρόκειται ποτέ να επεξεργάζεστε το ίδιο αρχείο ταυτόχρονα. - Ποτέ Μήπως happed αλλά τι γίνεται αν το κάνει;
  2. Ρουτίνα Επεξεργασία μπορούσε να αποθηκεύσει ένα αντίγραφο των αρχικών δεδομένων, καθώς και με τις ενημερώσεις και να συγκρίνετε όταν ο χρήστης έχει ολοκληρώσει την επεξεργασία. Αν διαφέρουν χρήστη εμφάνιση και Επιβεβαιώστε τι ενημέρωση - θα απαιτούσε δύο αντίγραφα των δεδομένων που θα αποθηκευτούν.
  3. Προσθέστε τελευταία ενημέρωση στήλη DATETIME και ελέγξτε ταιριάζει όταν ενημερώσουμε, αν όχι τότε παρουσιάζουν διαφορές. - απαιτεί νέα στήλη σε κάθε ένα από τους σχετικούς πίνακες.
  4. Δημιουργήστε έναν πίνακα επεξεργασίας που καταγράφει όταν οι χρήστες αρχίσουν την επεξεργασία ενός ρεκόρ που θα πρέπει να ελέγχονται και να αποτρέψει άλλους χρήστες από την επεξεργασία ίδιο ρεκόρ. - θα απαιτούσε carful σκέψη της ροής του προγράμματος για την πρόληψη αδιέξοδα και τα αρχεία γίνει κλειδωμένη, αν ένας χρήστης συντρίβεται από το πρόγραμμα.

Υπάρχουν καλύτερες λύσεις ή θα πρέπει να πάω για ένα από αυτά;

Δημοσιεύθηκε 03/08/2008 στις 22:23
πηγή χρήστη
Σε άλλες γλώσσες...                            


8 απαντήσεις

ψήφοι
12

Αν περιμένετε σπάνια συγκρούσεις, Αισιόδοξη Παράλληλεσ είναι πιθανώς το καλύτερο στοίχημά σας.

Scott Mitchell έγραψε ένα ολοκληρωμένο πρόγραμμα εκμάθησης σχετικά με την εφαρμογή αυτό το μοτίβο:
Εφαρμογή Αισιόδοξη Ταυτοχρονισμού

Απαντήθηκε 03/08/2008 στις 22:31
πηγή χρήστη

ψήφοι
2

Μια κλασική προσέγγιση είναι η εξής:

  • προσθέσετε μια boolean πεδίο, «κλειδωμένο» σε κάθε τραπέζι.
  • που αυτή η ψευδής από προεπιλογή.
  • όταν ένας χρήστης ξεκινά την επεξεργασία, μπορείτε να το κάνετε αυτό:

    • κλειδώσετε τη γραμμή (ή το σύνολο του πίνακα, αν δεν μπορείτε να κλειδώσετε τη σειρά)
    • ελέγξτε τη σημαία στη γραμμή που θέλετε να επεξεργαστείτε
    • αν η σημαία είναι αλήθεια τότε
      • ενημερώνει το χρήστη ότι δεν μπορείτε να επεξεργαστείτε αυτή την σειρά αυτή τη στιγμή
    • αλλού
      • που τη σημαία σε πραγματικό
    • απασφαλιστεί

    • κατά την αποθήκευση της εγγραφής, που τη σημαία πίσω σε ψευδείς

Απαντήθηκε 01/10/2008 στις 09:53
πηγή χρήστη

ψήφοι
1

-πρώτο δημιουργήσει κατατεθεί (χρόνος ενημέρωση) για να αποθηκεύσετε ρεκόρ τελευταία ενημέρωση -όταν κάποιος χρήστης επιλέξει ρεκόρ αποθηκεύσετε Επιλέξτε το χρόνο, να συγκρίνουν μεταξύ επιλέξτε το χρόνο και το πεδίο του χρόνου ενημερωμένη έκδοση, εάν (χρόνος ενημέρωση)> (επιλέξτε το χρόνο), που σημαίνει μια άλλη ενημέρωση των χρηστών αυτό το ρεκόρ μετά επιλέξτε Ρεκόρ

Απαντήθηκε 14/07/2016 στις 11:23
πηγή χρήστη

ψήφοι
1

ΕΠΙΛΟΓΗ ΓΙΑ ΕΝΗΜΕΡΩΣΗ και ισοδύναμα είναι καλή παροχή κρατάτε την κλειδαριά για ένα μικροσκοπικό χρονικό διάστημα, αλλά για μια μακροσκοπική ποσότητα (π.χ. ο χρήστης έχει φορτωθεί τα δεδομένα και δεν έχει πιεστεί «σώσει» θα πρέπει να χρησιμοποιήσετε αισιόδοξος συγχρονισμός όπως παραπάνω. (Which πάντα σκέφτομαι είναι κακώς αποκαλείται - είναι πιο απαισιόδοξες από ό, τι «κερδίζει τελευταία συγγραφέα», η οποία είναι συνήθως η μόνη άλλη εναλλακτική λύση θεωρούνται).

Απαντήθηκε 01/10/2008 στις 06:39
πηγή χρήστη

ψήφοι
1

Μια άλλη επιλογή είναι να ελέγξετε ότι οι τιμές στο αρχείο που θέλετε να αλλάξετε είναι ακόμα το ίδιο όπως ήταν όταν αρχίσατε:

SELECT 
    customer_nm,
    customer_nm AS customer_nm_orig
FROM demo_customer
WHERE customer_id = @p_customer_id

(Εμφανίσετε το πεδίο customer_nm και ο χρήστης αλλάζει)

UPDATE demo_customer
SET customer_nm = @p_customer_name_new
WHERE customer_id = @p_customer_id
AND customer_name = @p_customer_nm_old

IF @@ROWCOUNT = 0
    RAISERROR( 'Update failed: Data changed' );

Δεν χρειάζεται να προσθέσετε μια νέα στήλη στο τραπέζι σας (και να το διατηρήσει μέχρι και σήμερα), αλλά εσείς πρέπει να δημιουργήσετε πιο λεπτομερή δηλώσεις SQL και να περάσει νέα και παλαιά πεδία για την αποθηκευμένη διαδικασία.

Έχει επίσης το πλεονέκτημα ότι δεν είστε το κλείδωμα των αρχείων - γιατί όλοι γνωρίζουμε ότι τα αρχεία θα καταλήξει να παραμένετε κλειδωμένο όταν δεν θα πρέπει να είναι ...

Απαντήθηκε 13/08/2008 στις 23:32
πηγή χρήστη

ψήφοι
1

@ Mark Harrison: SQL Server δεν υποστηρίζει ότι η σύνταξη ( SELECT ... FOR UPDATE).

Το αντίστοιχο SQL Server είναι η SELECTδήλωση υπόδειξη UPDLOCK.

Δείτε SQL Server Books Online για περισσότερες πληροφορίες.

Απαντήθηκε 04/08/2008 στις 22:54
πηγή χρήστη

ψήφοι
0

Με μένα, ο καλύτερος τρόπος έχω ένα lastUpdate στήλη (timetamp τύπο δεδομένων). όταν επιλέγουν και να ενημερώσετε μόνο συγκρίνουν αυτή την τιμή ένα άλλο πριν από αυτή τη λύση είναι ότι μπορείτε να χρησιμοποιήσετε αυτήν τη στήλη για να εντοπίσουμε το χρόνο των δεδομένων έχει αλλαγής. Νομίζω ότι δεν είναι καλό αν απλά δημιουργήσετε ένα colum όπως isLock για την ενημέρωση του ελέγχου.

Απαντήθηκε 24/06/2011 στις 08:14
πηγή χρήστη

ψήφοι
0

Η βάση δεδομένων θα το κάνει αυτό για σας. Κοιτάξτε «επιλέξτε ... για ενημέρωση», το οποίο έχει σχεδιαστεί ακριβώς για αυτό το είδος του πράγματος. Θα σας δώσει μια κλειδαριά εγγραφής για τις επιλεγμένες σειρές, το οποίο μπορείτε στη συνέχεια να δεσμευτούν ή να επαναφέρετε.

Απαντήθηκε 04/08/2008 στις 03:30
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more