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

Άποψη: 42676|Απάντηση: 4

[Πηγή] Χειρισμός ταυτόχρονης διάκρισης Timestamp και ConcurrencyCheck

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 8/4/2017 12:10:50 π.μ. | | | |


Συγγραφέας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)




Προηγούμενος:Πολιτική δημιουργίας εγγενούς πρωτεύοντος κλειδιού Nhibernate
Επόμενος:Το EF6 χρησιμοποιεί το Database.BeginTransaction για τη διαχείριση συναλλαγών
Δημοσιεύτηκε στις 22/3/2022 11:51:38 π.μ. |
Ευχαριστώ για τη σκληρή δουλειά, πολύ καλή ανάρτηση
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 1/11/2023 8:42:15 μ.μ. |
Εξαίρεση ταυτόχρονης εκτέλεσης EF DbUpdateConcurrencyException υποβάλλει εκ νέου ερώτημα στην προσωρινά αποθηκευμένη τιμή
https://www.itsvse.com/thread-10692-1-1.html
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 27/12/2023 7:54:01 μ.μ. |
Δηλώσεις μετεγκατάστασης που δημιουργούνται από το EF Core optimistic lock rowversion




Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com