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

 

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

Αλλαγές στο ίδιο SQL Table από διαφορετικούς χρήστες, πώς?

Îåêßíçóå áðü ôï ìÝëïò AlKiS. Τελευταία δημοσίευση από το μέλος George J. Capnias στις 09-12-2019, 11:49. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  06-12-2019, 18:04 78410

    Αλλαγές στο ίδιο SQL Table από διαφορετικούς χρήστες, πώς?

    Καλησπέρα ^^

     

    Έστω ότι έχουμε, σε ένα απομακρυσμένο υπολογιστή, ένα SQL Server (τουλάχιστον 2008, αλλά μπορεί μέχρι και 2019) και υπάρχει ένα .Net WinForms πρόγραμμα το οποίο διαβάζει το SQL Table "tab1" που έχει μέσα 2 εγγραφές "line1" και "line2", με 5 columns.

    Αν ανοίξει το πρόγραμμα ο πρώτος άνθρωπος και κάνει populate κάποιου είδους DataGridView, και εκείνη τη στιγμή ανοίξει το πρόγραμμα και κάνει το ίδιο και ο δεύτερος άνθρωπος,

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


    Νομίζω το καλύτερο θα ήταν να ένα μήνυμα που να του λέει ότι έχει γίνει μια αλλαγή και να ρωτάει αν θέλει να "κατεβάσει τις αλλαγές". Πώς θα γίνει αυτό; Έχουμε ένα timer ανά 1000ms να κοιτάει τον SQL Server τι έχει και να συγκρίνει αν είναι ίδιο με το DataTable που έχουμε locally ως data source στο DataGridView?

    Πώς κάνουμε handle κάτι τέτοιο; Κρατάμε σε μια μεταβλητή όλα τα κλουβιά και όλες τις αλλαγές που έχει κάνει ο δεύτερος σε αυτά, ανανεώνουμε το grid και μετά περνάμε τις αλλαγές του από πάνω;

     

    Όταν πατήσει το κουμπί για save, αυτό το κάνω με " SQLAdapt.Update(dt)". Τώρα αν έχει γίνει μια αλλαγή πιο πριν, βγάζει ένα πρόβλημα τύπου το timestamp του sql table δεν είναι το ίδιο με αυτό που έχεις και δεν μπορεί να εκτελεστεί το Update(). Κάνοντας το πάνω, λογικά θα διορθωθεί κι αυτό και θα μπορεί να γίνει save.

     

    Σε κάποιες περιπτώσεις χρειάζονται joins προτού πάρω το table, και εκεί δεν λειτουργεί ποτέ το Update γιατί τραβάω το τραπέζι με SQL Query με joins και τέτοια μέσα και δεν μπορεί να καταλάβει πώς ακριβώς να το κάνει. Σε αυτές τις περιπτώσεις τ σώζω τις αλλαγές. Σε αυτές τις περιπτώσεις συνήθως παίρνω μεμονωμένα values και τα βάζω σε textboxes κτλ, ανάλογα με το τι είναι η τιμή. Εδώ θέλει διαφορετική λογική για το τι θα γίνει εάν ο πρώτος άνθρωπος αλλάξει κάτι που βλέπει ο δεύτερος, ως προς το πώς θα ανανεώσουμε το τι βλέπει ο δεύτερος;

     

    Γενικά με μπερδεύει το πώς να χειριστώ την περίπτωση του 2 άτομα να κάνουν αλλαγές στο ίδιο sql table ταυτόχρονα.

     

    Εάν οι ερωτήσεις δεν είναι αρκετά καθαρές, θα μπορούσα να καθίσω να κάνω ένα απλό winforms app και ένα video που να δείχνω τι εννοώ. 

     


  •  08-12-2019, 14:35 78412 σε απάντηση της 78410

    Απ: Αλλαγές στο ίδιο SQL Table από διαφορετικούς χρήστες, πώς?

    Καλησπέρα,

    Αρχικά πιστεύω να κατανοείς, ότι ένα τέτοιο εγχείρημα - να έχεις μια φόρμα, να επικοινωνεί απευθείας με ένα SQL/Database over internet - δεν συνηθίζεται. Το επόμενο είναι ότι από τον καιρό που άρχισε η layered αρχιτεκτονική, γενικά δεν επιτρέπουμε στους clients να έχουν απευθείας connections επάνω στις βάσεις δεδομένων. Αυτό γίνεται, εκτός από λόγους ασφαλείας, και για να μπορεί η εφαρμογή μας να κάνει resource management - κυρίως cashing - κεντρικά, ώστε να επιτυγχάνουμε καλύτερη απόδοσή της.

    Από εκεί και πέρα, στην περίπτωσή σου - ο μηχανισμός που χρησιμοποιείς, το Dataset/SqlAdapter δεν έχει φτιαχτεί για αυτό το σκοπό που θέλεις να το χρησιμοποιήσεις - είναι φτιαγμένος για να χρησιμοποιηθεί από mobile κυρίως devices που θα λαμβάνουν ένα μικρό μέρος/section των δεδομένων (περιορισμένο αριθμό γραμμών) που δεν θα ενημερώνονται με άλλο τρόπο (τρίτες εφαρμογές). Φαντάσου πχ, αν ο πίνακάς σου δεν έχει 2 εγγραφές και δεν το χρησιμοποιούν 2 χρήστες που κάνουν δοκιμές, και λόγω της επιτυχίας της εφαρμογής σου, χρειάζεται να το χρησιμοποιήσουν 100 χρήστες με 10Κ εγγραφές, το πρόβλημα σου, δεν θα είναι ο μηχανισμός, αλλά ότι θα πρέπει αυτά τα set των δεδομένων, να ανεβοκατεβαίνουν από τους client στο server σε κάθε αλλαγή που θα γίνεται. Είναι αρκετά επώδυνο, αλλά γίνεται, να επηρεάσεις το μηχανισμό του Dataset/SqlAdapter, ώστε να κάνει partial updates, αλλά και πάλι δεν θα είναι εύκολο να διαχειριστείς τα conflicts που θα δημιουργούνται από τα μαζικά updates.

    Το προτιμότερο για την περίπτωσή σου, θα ήταν η εφαρμογή σου, να επικοινωνεί με την βάση σου, μέσω ενός service (soap ή rest). Έτσι υποβιβάζεις το πρόβλημα των πολλών που συνδέονται στην βάση, σε πρόβλημα ουράς - μπορεί πολλοί να χρησιμοποιούν το service ταυτόχρονα και παράλληλα, αλλά το service ελέγχει μία-μία εγγραφή και απαντά ειδικά στον κάθε client αν είναι δεκτό το update του, ξέροντας τι έχει περάσει μέχρι εκείνη τη στιγμή στη βάση. Αν οι ενημερώσεις που θα κάνει το service στην βάση είναι βάση pessimistic ή optimistic μοντέλο, είναι καθαρά σε σένα.

      

     George J.

     


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  08-12-2019, 20:51 78413 σε απάντηση της 78412

    Απ: Αλλαγές στο ίδιο SQL Table από διαφορετικούς χρήστες, πώς?

    I see.

    Ευχαριστώ πολύ για την απάντηση - τέτοιου είδους πληροφορία είναι ακριβώς αυτό που χρειάζομαι.

    Επειδή δεν έχω ασχοληθεί στο παρελθόν με κάτι τέτοιο, δεν γνωρίζω καν αρκετά για να ξέρω να κάνω τις σωστές ερωτήσεις... μπορώ να γράψω ένα βαθύ νευρωνικό δίκτυο από τα μαθηματικά μέχρι τον κώδικα, αλλά όταν έρχεται σε βάσεις δεδομένων... well, bollocks :P


    Ωραία - ποιος θα ήταν ένας καλός τρόπος να μάθω αυτή τη μεθοδολογία; Υπάρχει κάποια σειρά μαθημάτων ή κάποιο tutorial;

    Συγκεκριμένα, θέλω να μάθω περισσότερα για "layered αρχιτεκτονική', μιας που δεν έχω κάνει ποτέ. Και για επικοινωνία με SQL Server με "restful service". Ξέρω για παράδειγμα ότι σε βιβλιοθήκες της R και Python η επικοινωνία από κάτω γίνεται με restful service, αλλά δεν έχω ιδέα πώς να κάνω implement κάτι τέτοιο myself.

     

    Αχά, δεν το ήξερα αυτό για το SqlAdapter. Μέχρι να μάθω πώς να προγραμματίζω με layered architecture και να επικοινωνώ με rest, σκέφτηκα ότι θα μπορούσα να βγάλω το "DataTable.AcceptChanges()" γιατί παρακάμπτει οποιονδήποτε έλεγχο για αλλαγές, να βάλω το SQLAdapter.Update() μέσα σε try και να πιάνω System.Data.DBConcurrencyException

    Αν γίνει rise, τότε κάποιος άλλος έκανε αλλαγή και μπορώ να ρωτάω τον χρήστη αν θέλει να ανανεώσει την πληροφορία (και να χάσει τις αλλαγές του?) ή αν θέλει να παρακάμψει τις αλλαγές που έκαναν οι υπόλοιποι και απλά να κάνει enforce τα δικά του

    [το πρώτο με το να γίνει ξανά populate το DataTable με το query που έγινε αρχικά, και το δεύτερο με το δώσει DataTable.AcceptChanges() και να ξανακάνει SQLAdapter.Update()]

     

    P.S. προφανώς θα ψάξω και μόνος μου πώς να μάθω τα 2 πράγματα αυτά, αλλά θα χαρώ πολύ αν έχετε κάτι συγκεκριμένο που μπορείτε να μου δείξετε :D


  •  09-12-2019, 10:53 78414 σε απάντηση της 78413

    Απ: Αλλαγές στο ίδιο SQL Table από διαφορετικούς χρήστες, πώς?

    Καλημέρα σου,

    Να ξεκινήσω ότι καταλαβαίνω τη θέση σου - άλλο να έχεις να δημιουργήσεις επάνω σε μία ιδέα που έχεις, και άλλο να γράφεις λογική Line-Of-Business (LOB) applications. Επειδή το διαδίκτυο είναι φορτωμένο από tutorials, είτε με καινούργιες είτε με παλιές εκδόσεις της πλατφόρμας .NET/.NET Core, θα σου προτείνω, αρχικά να δεις κάποια πράγματα πιο γενικά, πχ. Multi-tier architecture στο Wikipedia, να δεις κάποια παραδείγματα n-tier που έχει μέσα στο MSDN, όπως "Walkthrough: Create an n-tier data application" και "HOW TO: Write a Simple Web Service by Using Visual C# .NET". Μην τα πάρεις τις μετρητοίς - δεν είναι αυτό που θες να κάνεις, είναι ο δρόμος για αυτό που θέλεις.

    Τέλος, να επιστήσω την προσοχή σου για τα χιλιάδες tutorials που υπάρχουν αναρτημένα στο διαδίκτυο, ότι κανένα από αυτά δεν αποτελεί την "λύση", αλλά "ιδέες" για να υλοποιήσεις την "δική σου λύση".

      

    George J. 

     


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  09-12-2019, 11:49 78415 σε απάντηση της 78413

    Απ: Αλλαγές στο ίδιο SQL Table από διαφορετικούς χρήστες, πώς?

    Αν γίνει rise, τότε κάποιος άλλος έκανε αλλαγή και μπορώ να ρωτάω τον χρήστη αν θέλει να ανανεώσει την πληροφορία (και να χάσει τις αλλαγές του?) ή αν θέλει να παρακάμψει τις αλλαγές που έκαναν οι υπόλοιποι και απλά να κάνει enforce τα δικά του

    [το πρώτο με το να γίνει ξανά populate το DataTable με το query που έγινε αρχικά, και το δεύτερο με το δώσει DataTable.AcceptChanges() και να ξανακάνει SQLAdapter.Update()]

      

    Αυτό δεν το είδα - εδώ είναι αυτό που σου ανάφερα σε προηγούμενο μήνυμα - προσπαθείς να στείλεις τις ενημερώσεις στην βάση: Το σίγουρο είναι ότι κάποια μπορούν να μπουν και κάποια όχι. Αν στην λογική σου βάλεις ότι ο χρήστης θα έχει τη δύναμη να κάνει enforce τα δικά του, τότε θα ξεκινάς διαδικασίες που στην πραγματικότητα δεν έχουν νόημα (στο business κομμάτι της εφαρμογής, το λογικό κομμάτι) και που πυροδοτούν για σένα ανάπτυξη που στην πραγματικότητα δεν χρειάζεται (γιατί να μην ξεχωρίσεις αυτές που μπορούν να μπουν στη βάση, από αυτές που δεν μπορούν να μπουν στην βάση, και να βάλεις το χρήστη στη διαδικασία, να επιλέξει μία-προς-μία αν θέλει να τις κάνει enforce).

    Πιστεύω ότι από την περιγραφή που σου κάνω να κατανοείς την απόσταση μεταξύ business need (θέλω απλά να μπουν στην βάση) και την υλοποίηση που πιθανώς ένας προγραμματιστής να επιλέξει (να μπουν αυτές που μπορούν, και ο χρήστης να επιλέξει για τις υπόλοιπες μία-προς-μία, αν θέλει να τις κάνει enforce στη βάση). To δεύτερο σε καμιά περίπτωση δεν έχει τη business λογική που ζητείται να υλοποιηθεί - αν ο πρώτος  χρήστης έκρινε απαραίτητο να στείλει τις αλλαγές στη βάση, με τι κριτήρια ο δεύτερος χρήστης κρίνει ότι οι αλλαγές του πρώτου δεν είναι σημαντικές και οι δικές του είναι, ώστε να γραφούν στη βάση πάνω από του πρώτου; Αν η δικαιολογία για το παραπάνω, είναι ότι (ο δεύτερος χρήστης είναι "x" και πρέπει να περνάει το δικό του), τότε η business ανάλυση είναι λάθος - δεν προσπαθείς να λύσεις το (θέλω απλά να μπουν στη βάση) αλλά κάτι διαφορετικό (που δεν ξέρεις γιατί δεν έχει περιγραφεί).

    Οπότε το μοντέλο που έχεις, AcceptChanges() και Update() είτε είναι αρκετό και παίζεις με αυτό, με μοναδική παράμετρο το είδος του compare optimistic (κάνει update αν έχει μόνο-και-μόνο το ίδιο id) ή pessimistic (κάνει update αν έχει κάθε στήλη έχει την ίδια τιμή που είχε αρχικά).

     

    George J.
     

     


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems