Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 42676|Odgovoriti: 4

[Vir] Obravnava razlik med sočasnim časovnim žigom in ConcurrencyCheck

[Kopiraj povezavo]
Objavljeno na 8. 04. 2017 00:10:50 | | | |


Avtorwww.itsvse.com @小渣渣 !
Uspešno vstavite osnovne podatke!
Testiranje funkcije ConcurrencyCheck je zaključeno
Posodobitev uspešna! Opomba 1
Posodobitev je izjemna! Opomba 2, nenavadne informacije! Stavek 'posodobi', vstavi ali izbriši 'shrani' je vplival na nepričakovano število vrstic (0). Entitete so morda bile spremenjene ali izbrisane od nalaganja entitet. Oglejte si http://go.microsoft.com/fwlink/?LinkId=472540 za informacije o razumevanju in ravnanju z izjemami optimistične sočasnosti.

Preizkusite razliko med Timestamp in ConcurrencyCheck
Posodobitev UpdateTab1 uspešna! Ime 1
Posodobitev Tab2 uspešna! Ime 1
Posodobitev UpdateTab2 je nenavadna! Ime 2, nenavadne informacije! Stavek 'posodobi', vstavi ali izbriši 'shrani' je vplival na nepričakovano število vrstic (0). Entitete so morda bile spremenjene ali izbrisane od nalaganja entitet. Oglejte si http://go.microsoft.com/fwlink/?LinkId=472540 za informacije o razumevanju in ravnanju z izjemami optimistične sočasnosti.
Posodobitev UpdateTab1 uspešna! Ime 2

【Časovni žig】
Funkcijo TimeStamp je mogoče uporabiti za razred polja, ki ima le eno bajtno polje, in ta funkcija nastavi tip tiemStamp na stolpec. Pri sočasnih preverjanjih Code-First samodejno uporablja to polje tipa TimeStamp.

【ConcurrencyCheck】
Funkcijo ConcurrencyCheck je mogoče uporabiti za lastnosti domenskega razreda. Ko EF izvede posodobitev operacijo, Code-First vpiše vrednost stolpca v stavek where condition, in to funkcijo CurrencyCheck lahko uporabite za uporabo obstoječih stolpcev za preverjanje sočasnosti, namesto da bi uporabljali ločen stolpec TimeStamp za preverjanje sočasnosti.

Začnimo z ustvarjanjem novega kontekstnega objekta, ki bo pokazal razliko med Timestamp in ConcurrencyCheck v sočasnem procesiranju!

Tukaj je koda za kontekst:




Poglejmo si stolpce baze podatkov, kot sledi:



Ugotovili bomo, da imata tab1 in tab2 stolpce ID, Ime in Opomba, tab2 pa več stolpcov Različica vrstice kot tab1.

Najprej priložite testno kodo:



【Načelo sočasnosti】



Funkcijo ConcurrencyCheck smo dodali k lastnosti Remark v Tab1,


Ko istočasno posodobimo vrednost atributa Name za iste podatke, ni nobene izjeme!


Generirajte SQL stavke:


izvršni sp_executesql N'UPDATE [dbo]. [Tab1]
SET [Ime] = @0
KJER (([Id] = @1) IN ([Opomba] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'ime1',@1=1,@2=N'Note1'
izvršni sp_executesql N'UPDATE [dbo]. [Tab1]
SET [Ime] = @0
KJER (([Id] = @1) IN ([Opomba] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'ime2',@1=1,@2=N'note1'

Ko istočasno posodobimo vrednost lastnosti Remark za iste podatke, vržemo izjemo!

Generirajte SQL stavke:

izvršni sp_executesql N'UPDATE [dbo]. [Tab1]
NASTAVI [Opomba] = @0
KJER (([Id] = @1) IN ([Opomba] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Note1',@1=1,@2=N'Note'
izvršni sp_executesql N'UPDATE [dbo]. [Tab1]
NASTAVI [Opomba] = @0
KJER (([Id] = @1) IN ([Opomba] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Note 2',@1=1,@2=N'Note'

Ugotovimo lahko, da če istočasno vzamemo isti podatek z Id 1, dobimo vrednost atributa Remark, in ob posodobitvi atributa Remark uporabimo Remark kot pogoj za posodobitev.

Prvi SQL stavek je mogoče uspešno posodobiti, nato se opomba spremeni v "opomba 1", in ko se drugi SQL stavek posodobi, posodobitev ne uspe, ker se je vrednost opombe spremenila.

【Načelo časovnega žiga】

Dodali smo lastnost RowVersion v Tab2 (lahko vzamete katerokoli ime) in dodali funkcijo časovnega žiga!!



Ko hkrati posodobimo vrednost imena istih podatkov, prva posodobitev uspe, druga posodobitev ne uspe in se vrže izjema, poglejmo si generirano SQL kodo!

izvršni sp_executesql N'UPDATE [dbo]. [Tab2]
SET [Ime] = @0
KJER ((([Id] = @1) IN ([RowVersion] = @2)) IN ([Opomba] = @3))
IZBERI [RowVersion]
IZ [dbo]. [Tab2]
KJER @@ROWCOUNT > 0 IN [Id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binarno(8),@3 nvarchar(max) ',@0=N'Name1',@1=1,@2=0x00000000000007D1,@3=N'Note'
izvršni sp_executesql N'UPDATE [dbo]. [Tab2]
SET [Ime] = @0
KJER ((([Id] = @1) IN ([RowVersion] = @2)) IN ([Opomba] = @3))
IZBERI [RowVersion]
IZ [dbo]. [Tab2]
KJER @@ROWCOUNT > 0 IN [Id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binarno(8),@3 nvarchar(max) ',@0=N'name2',@1=1,@2=0x00000000000007D1,@3=N'Note'

Pri izvajanju drugega SQL stavka, ker podatkov stanja where ni več mogoče najti, posodobitev ne uspe in se vrže izjema!!

Ko je prvi SQL ukaz uspešno izveden, se vrednost RowVersion spremeni, kot je prikazano na spodnji sliki:





RowsVersion je časovni žig

Rešitev za manjkajoče posodobitve   

Koncept manjkajočih posodobitev: Ko uporabniki istočasno spremenijo vrstico podatkov, najprej preberejo podatke, jih dodajo na sprednjo stran za spremembo in nato podatke ob spremembi pošljejo, tako da končno oddani podatki prepišejo prej oddane podatke, kar povzroči izgubo posodobitve.

Na kratko, tukaj je nekaj načinov, kako preprečiti izgubo posodobitev:

Uporabite časovni žig RowsVersion.

Če vrstica ni skladna z vrednostjo pred branjem, to pomeni, da je druga transakcija posodobila ta stolpec, tako da tega stolpca ni mogoče posodobiti, s čimer se prepreči izguba posodobitev.



Na koncu priložite izvorno kodo:
CodeFirstDemo.rar (4.94 KB, Število prenosov: 13)




Prejšnji:Nhibernate native politika generiranja primarnih ključev
Naslednji:EF6 uporablja Database.BeginTransaction za upravljanje transakcij
Objavljeno na 22. 03. 2022 11:51:38 |
Hvala za trdo delo, zelo dober zapis
 Najemodajalec| Objavljeno na 1. 11. 2023 20:42:15 |
EF sočasna izjema DbUpdateConcurrencyIzjema ponovno povprašuje shranjeno vrednost
https://www.itsvse.com/thread-10692-1-1.html
 Najemodajalec| Objavljeno na 27. 12. 2023 19:54:01 |
EF Core optimistic lock rowversion generira izjave o migraciji




Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com