See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 42676|Vastuse: 4

[Allikas] Samaaegse ajatempli ja samaaegse kontrolli eristuste käsitlemine

[Kopeeri link]
Postitatud 08.04.2017 00:10:50 | | | |


Autorwww.itsvse.com @小渣渣 !
Sisesta baasandmed edukalt!
ConcurrencyCheck funktsiooni testimine on lõpetatud
Uuendus õnnestus! Märkus 1
Uuendus on erakordne! Märkus 2, ebanormaalne info! Store update, insert või delete lause mõjutas ootamatult palju ridu (0). Entiteedid võivad olla muudetud või kustutatud alates entiteetide laadimisest. Vaata http://go.microsoft.com/fwlink/?LinkId=472540, et saada teavet optimistlike samaaegsuse erandite mõistmise ja käsitlemise kohta.

Testi erinevust Timestampi ja ConparallelChecki vahel
UpdateTab1 uuendus õnnestus! Nimi 1
UpdateTab2 uuendus õnnestus! Nimi 1
UpdateTab2 uuendus on ebatavaline! Nimeta kaks, ebanormaalne info! Store update, insert või delete lause mõjutas ootamatult palju ridu (0). Entiteedid võivad olla muudetud või kustutatud alates entiteetide laadimisest. Vaata http://go.microsoft.com/fwlink/?LinkId=472540, et saada teavet optimistlike samaaegsuse erandite mõistmise ja käsitlemise kohta.
UpdateTab1 uuendus õnnestus! Nimi 2

【TimeStamp】
TimeStampi funktsiooni saab rakendada väljaklassile, millel on ainult üks baitide massiivi omadus, ning see funktsioon määrab tiemStampi tüübi veerule. Samaaegsetes kontrollides kasutab Code-First automaatselt seda TimeStampi tüüpi välja.

【ConcurrencyCheck】
ConcurrencyCheck funktsiooni saab rakendada domeeniklassi omadustele. Kui EF teeb uuendusoperatsiooni, paneb Code-First veeru väärtuse where-tingimuslausesse ning seda CurrencyCheck funktsiooni saab kasutada olemasolevate veergude kasutamiseks samaaegsuse kontrollimiseks, selle asemel et kasutada eraldi TimeStamp veergu samaaegsuse kontrollimiseks.

Alustame uue kontekstiobjekti loomisest, et näidata erinevust Timestampi ja Concurrency Checki vahel samaaegsuse töötlemisel!

Siin on konteksti kood:




Vaatame andmebaasi veerge järgmiselt:



Leiame, et vahekaardil 1 ja vahelehel 2 on veergud Id, Nimi ja Märkus ning vahekaardil 2 on rohkem RowVersion veerge kui vahekaardil 1.

Lisa esmalt testkood:



【Samaaegsuse kontrolli printsiip】



Lisasime ConcurrencyCheck funktsiooni Tab1 Remark omadusse,


Kui uuendame sama andme nime atribuudi väärtust samaaegselt, ei tehta erandit!


Genereeri SQL-lauseid:


tegevjuht sp_executesql N'UPDATE [dbo]. [Tab1]
SET [Nimi] = @0
KUS (([id] = @1) JA ([Märkus] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'name1',@1=1,@2=N'Note1'
tegevjuht sp_executesql N'UPDATE [dbo]. [Tab1]
SET [Nimi] = @0
KUS (([id] = @1) JA ([Märkus] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'name2',@1=1,@2=N'note1'

Kui uuendame sama andme Remarki omaduse väärtust samaaegselt, viskame erandi!

Genereeri SQL-lauseid:

tegevjuht sp_executesql N'UPDATE [dbo]. [Tab1]
SET [Märkus] = @0
KUS (([id] = @1) JA ([Märkus] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Note1',@1=1,@2=N'Note'
tegevjuht sp_executesql N'UPDATE [dbo]. [Tab1]
SET [Märkus] = @0
KUS (([id] = @1) JA ([Märkus] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Note 2',@1=1,@2=N'Note'

Leiame, et kui võtame sama andmetüki Id 1-ga samaaegselt, saame Remarki atribuudi väärtuse ning Remarki atribuudi uuendamisel kasutame uuendustingimusena Remark'i.

Esimene SQL-lause saab edukalt uuendada, seejärel muudetakse märkus "note 1"-ks, ja kui teine SQL-lause uuendatakse, ebaõnnestub uuendus, sest märkuse väärtus on muutunud.

【Ajatempli printsiip】

Lisasime Tab2-le RowVersion omaduse (võid võtta ükskõik millise nime) ja lisasime Timestamp funktsiooni!!



Kui uuendame sama andmete nime väärtust samaaegselt, esimene uuendus õnnestub, teine ebaõnnestub ja visatakse erand, vaatame genereeritud SQL-koodi!

tegevjuht sp_executesql N'UPDATE [dbo]. [Tab2]
SET [Nimi] = @0
KUS ((([id] = @1) JA ([RowVersion] = @2)) JA ([Märkus] = @3))
SELECT [RowVersion]
FROM [dbo]. [Tab2]
KUS @@ROWCOUNT > 0 JA [id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binary(8),@3 nvarchar(max) ',@0=N'Name1',@1=1,@2=0x00000000000007D1,@3=N'Note'
tegevjuht sp_executesql N'UPDATE [dbo]. [Tab2]
SET [Nimi] = @0
KUS ((([id] = @1) JA ([RowVersion] = @2)) JA ([Märkus] = @3))
SELECT [RowVersion]
FROM [dbo]. [Tab2]
KUS @@ROWCOUNT > 0 JA [id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binary(8),@3 nvarchar(max) ',@0=N'name2',@1=1,@2=0x00000000000007D1,@3=N'Note'

Teise SQL-lause käivitamisel, kuna where tingimuse andmeid enam ei leita, ebaõnnestub uuendus ja visatakse erand!!

Pärast esimese SQL-lause edukat täitmist muutub RowVersioni väärtus, nagu alloleval joonisel näidatud:





RowsVersion on ajatempel

Lahendus puuduvate uuenduste lahendamiseks   

Puuduvate uuenduste kontseptsioon: Kui kasutajad muudavad andmerida samaaegselt, loevad nad esmalt andmed, panevad selle esipaneeli muutmiseks ja esitavad andmed siis, kui need on muudetud, nii et lõplik esitatud andmed kirjutavad varem esitatud andmete üle, mis põhjustab kadunud uuenduse.

Lühidalt öeldes, siin on viisid, kuidas vältida uuenduste kadumist:

Kasuta RowsVersion ajatemplit.

Kui rida on enne lugemist väärtusega vastuolus, tähendab see, et teine tehing on selle veeru uuendanud, nii et seda veergu ei saa uuendada, vältides seega uuenduste kadumist.



Lõpuks lisa lähtekood:
CodeFirstDemo.rar (4.94 KB, Allalaadimiste arv: 13)




Eelmine:Nhibernate põliselanike esmase võtme genereerimise poliitika
Järgmine:EF6 kasutab tehingute haldamiseks Database.BeginTransaction
Postitatud 22.03.2022 11:51:38 |
Aitäh raske töö eest, väga hea postitus
 Üürileandja| Postitatud 01.11.2023 20:42:15 |
EF samaaegsuse erik DbUpdateConcurrencyException pärib vahemällu salvestatud väärtuse uuesti
https://www.itsvse.com/thread-10692-1-1.html
 Üürileandja| Postitatud 27.12.2023 19:54:01 |
EF Core optimistlik lukustus reaversiooni genereeritud migratsioonilaused




Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com