Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 42676|Atbildi: 4

[Avots] Vienlaicīga laika zīmoga un vienlaicīgas pārbaudes atšķirības apstrāde

[Kopēt saiti]
Publicēts 08.04.2017 00:10:50 | | | |


Autorswww.itsvse.com @小渣渣 !
Ievietojiet bāzes datus veiksmīgi!
ConcurrencyCheck funkcijas testēšana ir pabeigta
Atjaunināšana veiksmīga! 1. piezīme
Atjauninājums ir ārkārtējs! 2. piezīme, neparasta informācija! Priekšraksta glabāšana, atjaunināšana, ievietošana vai dzēšana ietekmēja neparedzētu rindu skaitu (0). Entītijas, iespējams, ir modificētas vai izdzēstas kopš entītiju ielādes. Skatiet http://go.microsoft.com/fwlink/?LinkId=472540, lai iegūtu informāciju par optimistisku vienlaicīgu izņēmumu izpratni un apstrādi.

Pārbaudiet atšķirību starp Timestamp un ConcurrencyCheck
UpdateTab1 atjauninājums veiksmīgs! Vārds 1
UpdateTab2 atjauninājums veiksmīgs! Vārds 1
UpdateTab2 atjauninājums ir nenormāls! Vārds 2, neparasta informācija! Priekšraksta glabāšana, atjaunināšana, ievietošana vai dzēšana ietekmēja neparedzētu rindu skaitu (0). Entītijas, iespējams, ir modificētas vai izdzēstas kopš entītiju ielādes. Skatiet http://go.microsoft.com/fwlink/?LinkId=472540, lai iegūtu informāciju par optimistisku vienlaicīgu izņēmumu izpratni un apstrādi.
UpdateTab1 atjauninājums veiksmīgs! Vārds 2

【Laika zīmogs】
Līdzekli TimeStamp var lietot lauku klasei, kurai ir tikai viens baitu masīva rekvizīts, un šis līdzeklis iestata kolonnas tipu tiemStamp. Vienlaicīgās pārbaudēs Code-First automātiski izmanto šo TimeStamp tipa lauku.

【ConcurrencyCheck】
Līdzekli ConcurrencyCheck var lietot domēna klases rekvizītiem. Kad EF veic atjaunināšanas operāciju, Code-First ievieto kolonnas vērtību where nosacījuma priekšrakstā, un jūs varat izmantot šo CurrencyCheck līdzekli, lai izmantotu esošās kolonnas vienlaicīguma pārbaudei, nevis izmantot atsevišķu TimeStamp kolonnu vienlaicīguma pārbaudei.

Sāksim ar jauna konteksta objekta izveidi, lai parādītu atšķirību starp Timestamp un ConcurrencyCheck vienlaicīguma apstrādē!

Šeit ir konteksta kods:




Apskatīsim datu bāzes kolonnas šādi:



Mēs atradīsim, ka tab1 un tab2 ir kolonnas Id, Nosaukums un Piezīme, un tab2 ir vairāk RowVersion kolonnu nekā tab1.

Vispirms pievienojiet testa kodu:



【Vienlaicīguma pārbaudes princips】



Mēs pievienojām ConcurrencyCheck funkciju Tab1 rekvizītam Remark,


Vienlaikus atjauninot to pašu datu atribūta Name vērtību, izņēmums netiek izmests!


Ģenerējiet SQL paziņojumus:


exec sp_executesql N'UPDATE [dbo]. [1. cilne]
SET [nosaukums] = @0
WHERE (([id] = @1) UN ([Piezīme] = @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. cilne]
SET [nosaukums] = @0
WHERE (([id] = @1) UN ([Piezīme] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'name2',@1=1,@2=N'note1'

Vienlaikus atjauninot to pašu datu rekvizīta Remark vērtību, tiek radīts izņēmums!

Ģenerējiet SQL paziņojumus:

exec sp_executesql N'UPDATE [dbo]. [1. cilne]
SET [Piezīme] = @0
WHERE (([id] = @1) UN ([Piezīme] = @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. cilne]
SET [Piezīme] = @0
WHERE (([id] = @1) UN ([Piezīme] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Note 2',@1=1,@2=N'Note'

Mēs varam konstatēt, ka, ja mēs vienlaicīgi ņemam to pašu datu daļu ar ID 1, mēs iegūsim atribūta Remark vērtību, un, atjauninot atribūtu Remark, mēs izmantosim Remark kā atjaunināšanas nosacījumu.

Pirmo sql priekšrakstu var veiksmīgi atjaunināt, un pēc tam piezīme tiek mainīta uz "1. piezīme", un, atjauninot otro sql priekšrakstu, atjaunināšana neizdosies, jo piezīmes vērtība ir mainījusies.

【Laika zīmoga princips】

Mēs pievienojām RowVersion rekvizītu Tab2 (jūs varat pieņemt jebkuru vārdu) un pievienojām Timestamp funkciju!



Kad mēs vienlaikus atjauninām to pašu datu nosaukuma vērtību, pirmais atjauninājums izdodas, otrais atjauninājums neizdodas un tiek izmests izņēmums, apskatīsim ģenerēto sql kodu!

exec sp_executesql N'UPDATE [dbo]. [2. cilne]
SET [nosaukums] = @0
WHERE ((([id] = @1) AND ([RowVersion] = @2)) AND ([Piezīme] = @3))
SELECT [RowVersion]
NO [dbo]. [2. cilne]
KUR @@ROWCOUNT > 0 UN [id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binary(8),@3 nvarchar(max) ',@0=N'Name1',@1=1,@2=0x00000000000007D1,@3=N'Piezīme'
exec sp_executesql N'UPDATE [dbo]. [2. cilne]
SET [nosaukums] = @0
WHERE ((([id] = @1) AND ([RowVersion] = @2)) AND ([Piezīme] = @3))
SELECT [RowVersion]
NO [dbo]. [2. cilne]
KUR @@ROWCOUNT > 0 UN [id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binary(8),@3 nvarchar(max) ',@0=N'name2',@1=1,@2=0x00000000000007D1,@3=N'Piezīme'

Izpildot otro SQL paziņojumu, jo kur nosacījuma datus vairs nevar atrast, atjauninājums neizdodas un tiek izmests izņēmums!

Pēc tam, kad pirmais sql priekšraksts ir veiksmīgi izpildīts, RowVersion vērtība mainīsies, kā parādīts zemāk redzamajā attēlā:





RowsVersion ir laika zīmogs

Trūkstošo atjauninājumu risinājums   

Trūkstošo atjauninājumu jēdziens: Kad lietotāji vienlaikus modificē datu rindu, viņi vispirms nolasa datus, ievieto tos priekšgalā modificēšanai un pēc tam iesniedz datus, kad tie tiek modificēti, lai galīgie iesniegtie dati pārrakstītu iepriekš iesniegtos datus, kas izraisa zaudēto atjauninājumu.

Īsi sakot, šeit ir veidi, kā novērst atjauninājumu zaudēšanu:

Izmantojiet RowsVersion laika zīmogu.

Ja rinda neatbilst vērtībai pirms lasīšanas, tas nozīmē, ka cita transakcija ir atjauninājusi šo kolonnu, lai šo kolonnu nevarētu atjaunināt, tādējādi novēršot atjauninājumu zudumu.



Visbeidzot, pievienojiet avota kodu:
CodeFirstDemo.rar (4.94 KB, Lejupielādes skaits: 13)




Iepriekšējo:nhibernācijas vietējās primārās atslēgas ģenerēšanas politika
Nākamo:EF6 izmanto Database.BeginTransaction, lai pārvaldītu transakcijas
Publicēts 22.03.2022 11:51:38 |
Paldies par smago darbu, ļoti labs ieraksts
 Saimnieks| Publicēts 01.11.2023 20:42:15 |
EF vienlaicīguma izņēmums DbUpdateConcurrencyException atkārtoti vaicā kešatmiņā saglabāto vērtību
https://www.itsvse.com/thread-10692-1-1.html
 Saimnieks| Publicēts 27.12.2023 19:54:01 |
EF Core optimistiskas bloķēšanas rindas versijas ģenerēti migrācijas pārskati




Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com