Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 42676|Atsakyti: 4

[Šaltinis] Lygiagrečios laiko žymos ir sutapimo tikrinimo skirtumo tvarkymas

[Kopijuoti nuorodą]
Paskelbta 2017-04-08 00:10:50 | | | |


Autoriuswww.itsvse.com @小渣渣 !
Sėkmingai įterpkite pagrindinius duomenis!
"ConcurrencyCheck" funkcijos testavimas baigtas
Atnaujinimas sėkmingas! 1 pastaba
Atnaujinimas yra išskirtinis! 2 pastaba, nenormali informacija! Sakinio saugojimas, naujinimas, įterpimas arba naikinimas paveikė netikėtą eilučių skaičių (0). Objektai gali būti modifikuoti arba panaikinti įkėlus objektus. Žr. http://go.microsoft.com/fwlink/?LinkId=472540 informacijos apie optimistinių sutapimo išimčių supratimą ir tvarkymą.

Patikrinkite skirtumą tarp laiko žymos ir ConcurrencyCheck
UpdateTab1 atnaujinimas sėkmingas! Vardas 1
UpdateTab2 atnaujinimas sėkmingas! Vardas 1
UpdateTab2 atnaujinimas yra nenormalus! Vardas 2, nenormali informacija! Sakinio saugojimas, naujinimas, įterpimas arba naikinimas paveikė netikėtą eilučių skaičių (0). Objektai gali būti modifikuoti arba panaikinti įkėlus objektus. Žr. http://go.microsoft.com/fwlink/?LinkId=472540 informacijos apie optimistinių sutapimo išimčių supratimą ir tvarkymą.
UpdateTab1 atnaujinimas sėkmingas! Vardas 2

【Laiko žyma】
Funkcija TimeStamp gali būti taikoma lauko klasei, kuri turi tik vieno baitų masyvo ypatybę, ir ši funkcija nustato stulpelio tipą tiemStamp. Atliekant vienalaikius patikrinimus, Code-First automatiškai naudoja šį lauką TimeStamp tipas.

【Sutapimo patikrinimas】
ConcurrencyCheck funkcija gali būti taikoma domeno klasės ypatybėms. Kai EF atlieka naujinimo operaciją, Code-First įrašo stulpelio reikšmę į sakinį where sąlyga, ir jūs galite naudoti šią CurrencyCheck funkciją, jei norite naudoti esamus stulpelius sutapimui tikrinti, o ne naudoti atskirą TimeStamp stulpelį sutapimui tikrinti.

Pradėkime nuo naujo konteksto objekto sukūrimo, kad parodytume skirtumą tarp laiko žymos ir sutapimo apdorojimo metu!

Štai konteksto kodas:




Pažvelkime į duomenų bazės stulpelius taip:



Pamatysime, kad 1 ir 2 skirtukuose yra stulpeliai ID, Pavadinimas ir Pastaba, o 2 skirtuke yra daugiau RowVersion stulpelių nei 1 skirtuke.

Pirmiausia pridėkite testo kodą:



【Sutapimo patikrinimo principas】



Mes pridėjome ConcurrencyCheck funkciją prie Tab1 ypatybės Pastaba,


Kai tuo pačiu metu atnaujiname tų pačių duomenų atributo Name reikšmę, jokia išimtis nebūna!


Generuoti SQL sakinius:


exec sp_executesql N'UPDATE [dbo]. [1 skirtukas]
SET [Vardas] = @0
WHERE (([id] = @1) AND ([Pastaba] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'name1',@1=1,@2=N'Note1'
exec sp_executesql N'UPDATE [dbo]. [1 skirtukas]
SET [Vardas] = @0
WHERE (([id] = @1) AND ([Pastaba] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'name2',@1=1,@2=N'note1'

Kai tuo pačiu metu atnaujiname tų pačių duomenų ypatybės Remark reikšmę, pateikiame išimtį!

Generuoti SQL sakinius:

exec sp_executesql N'UPDATE [dbo]. [1 skirtukas]
SET [Pastaba] = @0
WHERE (([id] = @1) AND ([Pastaba] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Note1',@1=1,@2=N'Note'
exec sp_executesql N'UPDATE [dbo]. [1 skirtukas]
SET [Pastaba] = @0
WHERE (([id] = @1) AND ([Pastaba] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Pastaba 2',@1=1,@2=N'Pastaba'

Galime pastebėti, kad jei tuo pačiu metu paimsime tuos pačius duomenis su ID 1, gausime atributo Remark vertę, o atnaujindami atributą Remark naudosime Remark kaip atnaujinimo sąlygą.

Pirmasis sql sakinys gali būti sėkmingai atnaujintas, tada pastaba pakeičiama į "1 pastaba", o atnaujinus antrąjį sql sakinį, atnaujinti nepavyks, nes pasikeitė pastabos reikšmė.

【Laiko žymos principas】

Mes pridėjome RowVersion ypatybę į Tab2 (galite imtis bet kokio pavadinimo) ir pridėjome Timestamp funkciją!



Kai tuo pačiu metu atnaujiname tų pačių duomenų pavadinimo reikšmę, pirmasis atnaujinimas pavyksta, antrasis atnaujinimas nepavyksta ir pateikiama išimtis, pažvelkime į sugeneruotą sql kodą!

exec sp_executesql N'UPDATE [dbo]. [2 skirtukas]
SET [Vardas] = @0
WHERE ((([id] = @1) AND ([RowVersion] = @2)) AND ([Pastaba] = @3))
SELECT [RowVersion]
IŠ [dbo]. [2 skirtukas]
KUR @@ROWCOUNT > 0 IR [id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binary(8),@3 nvarchar(max) ',@0=N'Name1',@1=1,@2=0x00000000000007D1,@3=N'Pastaba'
exec sp_executesql N'UPDATE [dbo]. [2 skirtukas]
SET [Vardas] = @0
WHERE ((([id] = @1) AND ([RowVersion] = @2)) AND ([Pastaba] = @3))
SELECT [RowVersion]
IŠ [dbo]. [2 skirtukas]
KUR @@ROWCOUNT > 0 IR [id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binary(8),@3 nvarchar(max) ',@0=N'name2',@1=1,@2=0x00000000000007D1,@3=N'Pastaba'

Vykdant antrąjį SQL sakinį, nes kur sąlygos duomenų nebegalima rasti, atnaujinimas nepavyksta ir išimtis yra išmesta!

Sėkmingai įvykdžius pirmąjį sql sakinį, RowVersion reikšmė pasikeis, kaip parodyta paveikslėlyje žemiau:





RowsVersion yra laiko žyma

Trūkstamų naujinimų sprendimo būdas   

Trūkstamų naujinimų samprata: Kai vartotojai tuo pačiu metu keičia duomenų eilutę, jie pirmiausia nuskaito duomenis, įdeda juos į priekinę dalį modifikuoti, o tada pateikia duomenis, kai jie modifikuojami, kad galutiniai pateikti duomenys perrašytų anksčiau pateiktus duomenis, o tai sukelia prarastą naujinimą.

Trumpai tariant, čia yra būdų, kaip išvengti naujinimų praradimo:

Naudokite RowsVersion laiko žymą.

Jei eilutė neatitinka reikšmės prieš skaitant, tai reiškia, kad kita operacija atnaujino šį stulpelį, todėl šio stulpelio negalima atnaujinti, taip išvengiant naujinimų praradimo.



Galiausiai pridėkite šaltinio kodą:
CodeFirstDemo.rar (4.94 KB, Atsisiuntimų skaičius: 13)




Ankstesnis:nhibernuoti vietinio pirminio rakto generavimo strategiją
Kitą:EF6 naudoja Database.BeginTransaction operacijoms valdyti
Paskelbta 2022-03-22 11:51:38 |
Ačiū už sunkų darbą, labai geras paštu
 Savininkas| Paskelbta 2023-11-01 20:42:15 |
EF sutapimo išimtis DbUpdateConcurrencyException iš naujo pateikia talpyklos reikšmės užklausą
https://www.itsvse.com/thread-10692-1-1.html
 Savininkas| Paskelbta 2023-12-27 19:54:01 |
EF Core optimistinio užrakto eilutės versijos sugeneruoti perkėlimo sakiniai




Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com