Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
parido
Δημοσιεύσεις: 12
Εγγραφή: 07 Ιαν 2008 11:49
Τοποθεσία: athina

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από parido » 19 Μαρ 2008 15:05

ΓΕΙΑ ΣΑΣ,
ΕΧΩ ΜΙΑ ΕΦΑΡΜΟΓΗ ΠΟΥ ΤΡΑΒΑΕΙ ΑΠΟ ΒΑΣΗ ΚΑΠΟΙΕΣ ΕΓΓΡΑΦΕΣ. ΘΕΛΩ ΟΤΑΝ ΕΝΑΣ ΧΡΗΣΤΗΣ ΕΧΕΙ ΑΝΟΞΕΙ ΚΑΙ ΕΠΕΞΕΡΓΑΖΕΤΑΙ ΜΙΑ ΕΓΓΡΑΦΗ ΘΕΛΩ ΝΑ "ΚΛΕΙΔΩΝΕΙ" ΩΣΤΕ ΝΑ ΜΗΝ ΜΠΟΡΕΙ ΝΑ ΤΗΝ ΑΝΟΙΞΕΙ ΚΑΠΟΙΟΣ ΑΛΛΟΣ. ΕΧΕΙ ΚΑΝΕΙΣ ΚΑΜΙΑ ΙΔΕΑ ΤΟΥ ΠΩΣ ΜΠΟΡΕΙ ΝΑ ΓΙΝΕΙ ΑΥΤΟ?ΕΥΧΑΡΙΣΤΩ

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από skeftomilos » 19 Μαρ 2008 16:39

Μια ιδέα είναι να φτιάξεις ένα πίνακα Locks, με πεδία TableName, RecordId, UserId, και LockedDate. Προτού ανοίξεις μίε εγγραφή σε ένα χρήστη μπορείς να κοιτάς αν έχει ανοίχτεί από κάποιον άλλον, και αν όχι να καταγράφεις το άνοιγμα στον πίνακα Locks.

- Ένας χρήστης μπορεί να έχει μία το πολύ κλειδωμένη εγγραφή κάθε δεδομένη στιγμή.
- Μια εγγραφή παύει να θεωρείται κλειδωμένη αν περάσει x χρόνος από την ώρα που κλειδώθηκε.

Άβαταρ μέλους
Banavas
Script Master
Δημοσιεύσεις: 1367
Εγγραφή: 21 Νοέμ 2004 20:25
Επικοινωνία:

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από Banavas » 19 Μαρ 2008 19:57

- Μια εγγραφή παύει να θεωρείται κλειδωμένη αν περάσει x χρόνος από την ώρα που κλειδώθηκε.
Αυτό αφήνει τα πράγματα στην τύχη τους.
Εγώ θα πρότεινα για τον κάθε χρήστη να ξεκινάει ένα session και το id του να καταγράφετε σε ένα επιπλέον πεδίο του παραπάνω πίνατα π.χ. session_id.
Κάθε φορά που κάποιος χρήστης προσπαθεί να προσπελάσει ένα κλειδωμένο record, πρέπει να ελέγχεται αν το session που κρατά κλειδωμένο το record υφίσταται. Έτσι διασφαλίζεται οτι δε θα ανοιχτεί ταυτόχρονα από δύο ή περισσότερους χρήστες.
Happy coding....
Μάρκος
http://lasernet.gr

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από skeftomilos » 19 Μαρ 2008 21:07

Ας πούμε ότι ένας χρήστης κλείδωσε μία εγγραφή στις 09:00 το πρωί, και μετά βγήκε αλλά συνέχισε να κινείται στο site μέχρι τις 17:00 το απόγευμα, διατηρώντας με αυτό τον τρόπο άθικτο το session_id. Με ποιο τρόπο δα εμποδίσουμε την εγγραφή να παραμείνει κλειδωμένη χωρίς λόγο για ένα ολόκληρο οχτάωρο;

Άβαταρ μέλους
Banavas
Script Master
Δημοσιεύσεις: 1367
Εγγραφή: 21 Νοέμ 2004 20:25
Επικοινωνία:

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από Banavas » 19 Μαρ 2008 23:11

E τοτε υπάρχει πρόβλημα.
Βέβαια το παράδειγμα είναι τραβηγμένο και μάλλον απίθανο να συμβεί. Αλλά ακόμη και αν συμβεί πάλι ναι μεν δεν θα έχουμε πρόσβαση στο record, αλλά αποκλείεται η διπλή χρήση.

Απ την άλλη αν το κλείδωμα λήγει με χρόνο, και μπεί μικρό χρονικό όριο υπάρχει σοβαρός κίνδυνος για διπλή ή τριπλή χρήση. Αν πάλι μπει μεγάλο χρονικό περιθώριο θα μένει κλειδωμένο άσκοπα.
Happy coding....
Μάρκος
http://lasernet.gr

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από skeftomilos » 20 Μαρ 2008 00:02

Η διπλή χρήση είναι κίνδυνος μόνο αν δεν κάνουμε επιπλέον και έλεγχο concurrency. Σε ένα σύστημα πολλών χρηστών νομίζω καλό είναι να ελέγχουμε την concurrency ακόμα και αν θεωρητικά έχουμε αποκλείσει την πιθανότητα διπλής χρήσης μέσω του locking. Σε αυτή την περίπτωση τα locks είναι απλά μια εξυπηρέτηση προς τους χρήστες, για να μην ξεκινήσουν ένα edit το οποίο δε θα μπορέσουν να σώσουν γιατί έτυχε να έρθουν δεύτεροι.

parido
Δημοσιεύσεις: 12
Εγγραφή: 07 Ιαν 2008 11:49
Τοποθεσία: athina

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από parido » 20 Μαρ 2008 10:31

Ευχαριστω για τις απαντησεις σας. Τελικα ξεκινησα να κανω κατι πιο απλο. Οταν ανοιγει καποιος μια αιτηση να γινεται η μια flag=1 και οταν κλεινει να γινεται 0. Και εναν ελεγχο αν θα ειναι 1 να μην μπορει να την κανει αλλος edit

Άβαταρ μέλους
Banavas
Script Master
Δημοσιεύσεις: 1367
Εγγραφή: 21 Νοέμ 2004 20:25
Επικοινωνία:

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από Banavas » 20 Μαρ 2008 11:53

Πως ελέγχεις το πότε κλείνει;
Happy coding....
Μάρκος
http://lasernet.gr

Άβαταρ μέλους
tsiger
Honorary Member
Δημοσιεύσεις: 1431
Εγγραφή: 11 Νοέμ 2002 13:40
Τοποθεσία: Thessaloniki Observation Center
Επικοινωνία:

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από tsiger » 20 Μαρ 2008 12:10

(offtopic ignore me) dimsis! re dimsis! κοιτα εδω δουλειες για να γινει ενα lock σε PHP.

Coldfusion ρε. Ρε! αγνοηστε με αγνοηστε με :D

parido
Δημοσιεύσεις: 12
Εγγραφή: 07 Ιαν 2008 11:49
Τοποθεσία: athina

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από parido » 20 Μαρ 2008 20:38

Banavas έγραψε:Πως ελέγχεις το πότε κλείνει;
Κλείνει όταν πατηθει καποιο κουμπι κανωντασ submit τη σελιδα στον εαυτο της και τρεχω το sql
Παιδευομαι λιγο στο να φτιάξω να ξεκλειδώνει όταν κάποιος χρηστής παει και κλείσει το παράθυρο χωρίς να πατήσει καποιο απο τα κουμπια (ακυρωση η αποθηκευση).

δλδ για παραδειγμα. εχω βαλει ενα hidden πεδιο και στο onclick του κουμπιου του δινει μια συγκεκριμενη τιμη και κανει submit τη σελιδα στον εαυτο της. οποτε αναλογα την τιμη που εχει το $_POST['hidden'] τρεχει και το sql που θελω

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από dva_dev » 20 Μαρ 2008 22:04

Σε περίπτωση διακοπής της επικοινωνίας, όπως διακοπή ηλεκτροδότησης -καθόλου σπάνιο τις μέρες αυτές ή αποσύνδεσης του καλωδίου δικτύου ή οποιοδήποτε πρόβλημα του υλικού, σε κάποιο σημείο από τον client μέχρι τον server που θα κόψει απότομα την επικοινωνία και θα την επαναφέρει το πιθανότερο μετά από αρκετές ώρες, τι θα κάνεις;

parido
Δημοσιεύσεις: 12
Εγγραφή: 07 Ιαν 2008 11:49
Τοποθεσία: athina

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από parido » 20 Μαρ 2008 22:40

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

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από cherouvim » 21 Μαρ 2008 07:49

http://en.wikipedia.org/wiki/Concurrenc ... _mechanism

Γιατί να μην μπορεί να την ανοίξει; Δημιουργείς bottleneck στο σύστημα.

Αν το πρόβλημα σου είναι να μην έχεις lost updates δηλαδή:

Κώδικας: Επιλογή όλων

χρήστης Α ανοίγει την εγγραφή στις 10:00
χρήστης Β ανοίγει την εγγραφή στις 10:05
χρήστης Β αλλάζει την εγγραφή στις 10:07 και πατάει save
χρήστης Α αλλάζει την εγγραφή στις 10:09 και πατάει save. Οι αλλαγές του B έχουν πάει κλαμένες
τότε μπορείς να κάνεις optimistic concurrency control με version ή timestamp.

Αλλιώς αν όντως θέλεις pessimistic locking κάνε αυτό που είπε ο skeftomilos στην αρχή του thread.
tsiger έγραψε:(offtopic ignore me) dimsis! re dimsis! κοιτα εδω δουλειες για να γινει ενα lock σε PHP.

Coldfusion ρε. Ρε! αγνοηστε με αγνοηστε με :D
Η plain old PHP είναι ένα επίπεδο πιο κάτω από αυτό που δουλεύεις εσύ. Υπάρχουν php web frameworks και ORMs που το κάνουν αυτό out of the box:
http://www.phpdoctrine.org/documentatio ... ng-manager

parido
Δημοσιεύσεις: 12
Εγγραφή: 07 Ιαν 2008 11:49
Τοποθεσία: athina

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από parido » 21 Μαρ 2008 09:13

βασικα ετσι οπως ειναι φτιαγμενο δεν μπορει κανενασ χρηστησ να ανοιξει μετα απο καποιον αλλον την εγγραφη, του πεταει μνμ οτι χρησιμοποιητε και κλεινει το παραθυρο (ανοιγει σε pop up η εγγραφη)

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από skeftomilos » 21 Μαρ 2008 20:04

parido έγραψε:
Banavas έγραψε:Πως ελέγχεις το πότε κλείνει;
Κλείνει όταν πατηθει καποιο κουμπι κανωντασ submit τη σελιδα στον εαυτο της και τρεχω το sql
Παιδευομαι λιγο στο να φτιάξω να ξεκλειδώνει όταν κάποιος χρηστής παει και κλείσει το παράθυρο χωρίς να πατήσει καποιο απο τα κουμπια (ακυρωση η αποθηκευση).

δλδ για παραδειγμα. εχω βαλει ενα hidden πεδιο και στο onclick του κουμπιου του δινει μια συγκεκριμενη τιμη και κανει submit τη σελιδα στον εαυτο της. οποτε αναλογα την τιμη που εχει το $_POST['hidden'] τρεχει και το sql που θελω
Το submit στο κλείσιμο φρόντισε να το τσεκάρεις με διάφορους browsers, και να το ελέγξεις και online γιατί είναι tricky.

- Η μαύρη τρύπα του scripting (JavaScript)

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 2 επισκέπτες