Συγγραφέαςwww.itsvse.com @小渣渣 ! Εισαγάγετε τα βασικά δεδομένα με επιτυχία! Η δοκιμή της λειτουργίας ConcurrencyCheck ολοκληρώθηκε Επιτυχής ενημέρωση! Σημείωση 1 Η ενημέρωση είναι εξαιρετική! Σημείωση 2, μη φυσιολογικές πληροφορίες! Η δήλωση αποθήκευσης, ενημέρωσης, εισαγωγής ή διαγραφής επηρέασε έναν απροσδόκητο αριθμό γραμμών (0). Οι οντότητες ενδέχεται να έχουν τροποποιηθεί ή διαγραφεί από τη στιγμή που φορτώθηκαν οι οντότητες. Δείτε http://go.microsoft.com/fwlink/?LinkId=472540 για πληροφορίες σχετικά με την κατανόηση και τον χειρισμό των αισιόδοξων εξαιρέσεων ταυτοχρονισμού.
Δοκιμάστε τη διαφορά μεταξύ Timestamp και ConcurrencyCheck Η ενημέρωση του UpdateTab1 ήταν επιτυχής! Όνομα 1 Η ενημέρωση του UpdateTab2 ήταν επιτυχής! Όνομα 1 Η ενημέρωση UpdateTab2 είναι μη φυσιολογική! Όνομα 2, μη φυσιολογικές πληροφορίες! Η δήλωση αποθήκευσης, ενημέρωσης, εισαγωγής ή διαγραφής επηρέασε έναν απροσδόκητο αριθμό γραμμών (0). Οι οντότητες ενδέχεται να έχουν τροποποιηθεί ή διαγραφεί από τη στιγμή που φορτώθηκαν οι οντότητες. Δείτε http://go.microsoft.com/fwlink/?LinkId=472540 για πληροφορίες σχετικά με την κατανόηση και τον χειρισμό των αισιόδοξων εξαιρέσεων ταυτοχρονισμού. Η ενημέρωση του UpdateTab1 ήταν επιτυχής! Όνομα 2
【Χρονική σήμανση】 Η δυνατότητα TimeStamp μπορεί να εφαρμοστεί στην κλάση πεδίου, η οποία έχει μόνο μία ιδιότητα πίνακα byte και αυτή η δυνατότητα ορίζει τον τύπο tiemStamp στη στήλη. Στους ταυτόχρονους ελέγχους, το Code-First χρησιμοποιεί αυτόματα αυτό το πεδίο τύπου TimeStamp.
【Έλεγχος συγχρονισμού】 Η δυνατότητα ConcurrencyCheck μπορεί να εφαρμοστεί στις ιδιότητες μιας κλάσης τομέα. Όταν το EF εκτελεί μια λειτουργία ενημέρωσης, το Code-First τοποθετεί την τιμή της στήλης στην πρόταση συνθήκης where και μπορείτε να χρησιμοποιήσετε αυτήν τη δυνατότητα CurrencyCheck για να χρησιμοποιήσετε τις υπάρχουσες στήλες για έλεγχο ταυτοχρονισμού, αντί να χρησιμοποιήσετε μια ξεχωριστή στήλη TimeStamp για έλεγχο ταυτοχρονισμού.
Ας ξεκινήσουμε δημιουργώντας ένα νέο αντικείμενο περιβάλλοντος για να δείξουμε τη διαφορά μεταξύ Timestamp και ConcurrencyCheck στην επεξεργασία συγχρονισμού!
Ακολουθεί ο κώδικας για το πλαίσιο:
Ας ρίξουμε μια ματιά στις στήλες της βάσης δεδομένων, ως εξής:
Θα διαπιστώσουμε ότι η καρτέλα 1 και η καρτέλα 2 έχουν στήλες Αναγνωριστικό, Όνομα και Παρατήρηση και η καρτέλα 2 έχει περισσότερες στήλες RowVersion από την καρτέλα 1.
Επισυνάψτε πρώτα τον κωδικό δοκιμής:
【Αρχή ελέγχου συγχρονισμού】
Προσθέσαμε τη δυνατότητα ConcurrencyCheck στην ιδιότητα Παρατήρηση του Tab1,
Όταν ενημερώνουμε την τιμή του χαρακτηριστικού Name των ίδιων δεδομένων ταυτόχρονα, δεν γίνεται καμία εξαίρεση!
Δημιουργία δηλώσεων SQL:
εκτελεστικός sp_executesql N'UPDATE [dbo]. [Καρτέλα 1] SET [Όνομα] = @0 ΟΠΟΥ (([id] = @1) ΚΑΙ ([Παρατήρηση] = @2)) ',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'name1',@1=1,@2=N'Note1' εκτελεστικός sp_executesql N'UPDATE [dbo]. [Καρτέλα 1] SET [Όνομα] = @0 ΟΠΟΥ (([id] = @1) ΚΑΙ ([Παρατήρηση] = @2)) ',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'name2',@1=1,@2=N'note1' Όταν ενημερώνουμε την τιμή της ιδιότητας Παρατήρηση των ίδιων δεδομένων ταυτόχρονα, κάνουμε μια εξαίρεση!
Δημιουργία δηλώσεων SQL:
εκτελεστικός sp_executesql N'UPDATE [dbo]. [Καρτέλα 1] SET [Παρατήρηση] = @0 ΟΠΟΥ (([id] = @1) ΚΑΙ ([Παρατήρηση] = @2)) ',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Note1',@1=1,@2=N'Note' εκτελεστικός sp_executesql N'UPDATE [dbo]. [Καρτέλα 1] SET [Παρατήρηση] = @0 ΟΠΟΥ (([id] = @1) ΚΑΙ ([Παρατήρηση] = @2)) ',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Σημείωση 2',@1=1,@2=N'Σημείωση' Μπορούμε να διαπιστώσουμε ότι εάν λάβουμε το ίδιο κομμάτι δεδομένων με το Id 1 ταυτόχρονα, θα λάβουμε την τιμή του χαρακτηριστικού Remark και κατά την ενημέρωση του χαρακτηριστικού Remark, θα χρησιμοποιήσουμε το Remark ως συνθήκη ενημέρωσης.
Η πρώτη πρόταση sql μπορεί να ενημερωθεί με επιτυχία και, στη συνέχεια, η παρατήρηση αλλάζει σε "σημείωση 1" και όταν ενημερωθεί η δεύτερη πρόταση sql, η ενημέρωση θα αποτύχει επειδή η τιμή της παρατήρησης έχει αλλάξει.
【Αρχή χρονικής σήμανσης】
Προσθέσαμε μια ιδιότητα RowVersion στο Tab2 (μπορείτε να πάρετε οποιοδήποτε όνομα) και προσθέσαμε τη δυνατότητα Timestamp!!
Όταν ενημερώνουμε την τιμή Όνομα των ίδιων δεδομένων ταυτόχρονα, η πρώτη ενημέρωση πετυχαίνει, η δεύτερη ενημέρωση αποτυγχάνει και δημιουργείται μια εξαίρεση, ας ρίξουμε μια ματιά στον κώδικα sql που δημιουργήθηκε!
εκτελεστικός sp_executesql N'UPDATE [dbo]. [Καρτέλα 2] SET [Όνομα] = @0 ΟΠΟΥ ((([Id] = @1) ΚΑΙ ([RowVersion] = @2)) ΚΑΙ ([Παρατήρηση] = @3)) ΕΠΙΛΕΞΤΕ [Έκδοση σειράς] ΑΠΟ [dbo]. [Καρτέλα 2] ΟΠΟΥ @@ROWCOUNT > 0 ΚΑΙ [Id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binary(8),@3 nvarchar(max) ',@0=N'Name1',@1=1,@2=0x00000000000007D1,@3=N'Note' εκτελεστικός sp_executesql N'UPDATE [dbo]. [Καρτέλα 2] SET [Όνομα] = @0 ΟΠΟΥ ((([Id] = @1) ΚΑΙ ([RowVersion] = @2)) ΚΑΙ ([Παρατήρηση] = @3)) ΕΠΙΛΕΞΤΕ [Έκδοση σειράς] ΑΠΟ [dbo]. [Καρτέλα 2] ΟΠΟΥ @@ROWCOUNT > 0 ΚΑΙ [Id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binary(8),@3 nvarchar(max) ',@0=N'name2',@1=1,@2=0x00000000000007D1,@3=N'Σημείωση' Κατά την εκτέλεση της δεύτερης εντολής SQL, επειδή τα δεδομένα της συνθήκης where δεν μπορούν πλέον να βρεθούν, η ενημέρωση αποτυγχάνει και γίνεται μια εξαίρεση!!
Μετά την επιτυχή εκτέλεση της πρώτης πρότασης sql, η τιμή του RowVersion θα αλλάξει, όπως φαίνεται στο παρακάτω σχήμα:
Το RowsVersion είναι χρονική σήμανση
Λύση για ενημερώσεις που λείπουν
Έννοια των ενημερώσεων που λείπουν: Όταν οι χρήστες τροποποιούν μια γραμμή δεδομένων ταυτόχρονα, πρώτα διαβάζουν τα δεδομένα, τα τοποθετούν στο μπροστινό μέρος για τροποποίηση και, στη συνέχεια, υποβάλλουν τα δεδομένα όταν τροποποιούνται, έτσι ώστε τα τελικά υποβληθέντα δεδομένα να αντικαταστήσουν τα δεδομένα που υποβλήθηκαν προηγουμένως, γεγονός που προκαλεί τη χαμένη ενημέρωση.
Εν συντομία, ακολουθούν τρόποι για να αποτρέψετε την απώλεια ενημερώσεων:
Χρησιμοποιήστε τη χρονική σήμανση RowsVersion.
Εάν μια σειρά δεν είναι συνεπής με την τιμή πριν από την ανάγνωση, σημαίνει ότι μια άλλη συναλλαγή έχει ενημερώσει αυτήν τη στήλη, έτσι ώστε αυτή η στήλη να μην μπορεί να ενημερωθεί, αποτρέποντας έτσι την απώλεια ενημερώσεων.
Τέλος, επισυνάψτε τον πηγαίο κώδικα:
CodeFirstDemo.rar
(4.94 KB, Αριθμός λήψεων: 13)
|