Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 42676|Antwoord: 4

[Bron] Omgaan met het onderscheid tussen gelijktijdige Timestamp en ConcurrencyCheck

[Link kopiëren]
Geplaatst op 08-04-2017 00:10:50 | | | |


Auteurwww.itsvse.com @小渣渣 !
Plaats de basisgegevens succesvol in!
Het testen van de ConcurrencyCheck-functie is voltooid
Update geslaagd! Noot 1
De update is uitzonderlijk! Opmerking 2, abnormale informatie! Store update, insert of delete-instructie beïnvloedde een onverwacht aantal rijen (0). Entiteiten kunnen zijn aangepast of verwijderd sinds entiteiten zijn geladen. Zie http://go.microsoft.com/fwlink/?LinkId=472540 voor informatie over het begrijpen en omgaan met uitzonderingen op positieve gelijktijdigheid.

Test het verschil tussen Timestamp en ConcurrencyCheck
Update Tab1-update geslaagd! Naam 1
UpdateTab2-update geslaagd! Naam 1
UpdateTab2-update is abnormaal! Naam 2, abnormale informatie! Store update, insert of delete-instructie beïnvloedde een onverwacht aantal rijen (0). Entiteiten kunnen zijn aangepast of verwijderd sinds entiteiten zijn geladen. Zie http://go.microsoft.com/fwlink/?LinkId=472540 voor informatie over het begrijpen en omgaan met uitzonderingen op positieve gelijktijdigheid.
Update Tab1-update geslaagd! Naam 2

【TimeStamp】
De TimeStamp-functie kan worden toegepast op de veldklasse, die slechts één bytearray-eigenschap heeft, en deze functie stelt het tiemStamp-type in op de kolom. Bij gelijktijdige controles gebruikt Code-First automatisch dit TimeStamp-type veld.

【ConcurrencyCheck】
De ConcurrencyCheck-functie kan worden toegepast op de eigenschappen van een domeinklasse. Wanneer EF een update-operatie uitvoert, plaatst Code-First de waarde van de kolom in de where-conditie-instructie, en je kunt deze CurrencyCheck-functie gebruiken om de bestaande kolommen te gebruiken voor gelijktijdigheidscontrole, in plaats van een aparte TimeStamp-kolom voor gelijktijdigheidscontrole.

Laten we beginnen met het creëren van een nieuw contextobject om het verschil tussen Timestamp en ConcurrencyCheck bij gelijktijdigheid te demonstreren!

Hier is de code voor de context:




Laten we eens kijken naar de kolommen van de database, als volgt:



We zullen zien dat tabblad1 en tab2 kolommen Id, Naam en Opmerking hebben, en tabblad2 meer kolommen RowVersion dan tabblad1.

Voeg eerst de testcode toe:



【ConcurrencyCheck Principle】



We hebben de ConcurrencyCheck-functie toegevoegd aan de Remark-eigenschap van Tab1,


Wanneer we de Naam-attribuutwaarde van dezelfde data op hetzelfde moment bijwerken, wordt er geen uitzondering gegooid!


Genereer SQL-instructies:


exec sp_executesql N'UPDATE [dbo]. [Tab1]
SET [Naam] = @0
WAAR (([Id] = @1) EN ([Opmerking] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'naam1',@1=1,@2=N'Note1'
exec sp_executesql N'UPDATE [dbo]. [Tab1]
SET [Naam] = @0
WAAR (([Id] = @1) EN ([Opmerking] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'naam2',@1=1,@2=N'note1'

Wanneer we de Remark-eigenschapswaarde van dezelfde data op hetzelfde moment bijwerken, gooien we een uitzondering!

Genereer SQL-instructies:

exec sp_executesql N'UPDATE [dbo]. [Tab1]
SET [Opmerking] = @0
WAAR (([Id] = @1) EN ([Opmerking] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Note1',@1=1,@2=N'Note'
exec sp_executesql N'UPDATE [dbo]. [Tab1]
SET [Opmerking] = @0
WAAR (([Id] = @1) EN ([Opmerking] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Noot 2',@1=1,@2=N'Noot'

We kunnen zien dat als we hetzelfde stuk data met Id 1 op hetzelfde moment nemen, we de waarde van het Remark-attribuut krijgen, en bij het updaten van het Remark-attribuut gebruiken we Remark als update-conditie.

De eerste SQL-instructie kan succesvol worden bijgewerkt, waarna de opmerking wordt veranderd in "note 1", en wanneer de tweede SQL-instructie wordt bijgewerkt, mislukt de update omdat de waarde van de opmerking is veranderd.

【Tijdstempelprincipe】

We hebben een RowVersion-eigenschap toegevoegd aan Tab2 (je kunt elke naam nemen) en de Timestamp-functie toegevoegd!!



Wanneer we de Naamwaarde van dezelfde data op hetzelfde moment bijwerken, de eerste update slaagt, de tweede update faalt en er een uitzondering wordt gegooid, laten we eens kijken naar de gegenereerde SQL-code!

exec sp_executesql N'UPDATE [dbo]. [Tab2]
SET [Naam] = @0
WAAR ((([Id] = @1) EN ([RowVersion] = @2)) EN ([Opmerking] = @3))
SELECTEER [RowVersion]
VAN [dbo]. [Tab2]
WAAR @@ROWCOUNT > 0 EN [Id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binair(8),@3 nvarchar(max) ',@0=N'Naam1',@1=1,@2=0x00000000000007D1,@3=N'Note'
exec sp_executesql N'UPDATE [dbo]. [Tab2]
SET [Naam] = @0
WAAR ((([Id] = @1) EN ([RowVersion] = @2)) EN ([Opmerking] = @3))
SELECTEER [RowVersion]
VAN [dbo]. [Tab2]
WAAR @@ROWCOUNT > 0 EN [Id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binair(8),@3 nvarchar(max) ',@0=N'naam2',@1=1,@2=0x00000000000007D1,@3=N'Note'

Bij het uitvoeren van de tweede SQL-instructie, omdat de data van de where-voorwaarde niet meer gevonden kan worden, mislukt de update en wordt er een uitzondering gegooid!!

Nadat de eerste SQL-instructie succesvol is uitgevoerd, verandert de waarde van RowVersion, zoals weergegeven in de onderstaande figuur:





RowsVersion is een tijdstempel

Oplossing voor ontbrekende updates   

Concept van ontbrekende updates: Wanneer gebruikers tegelijkertijd een regel data wijzigen, lezen ze eerst de data, plaatsen deze aan de front-end voor aanpassing, en dienen de data vervolgens in bij de wijziging, zodat de uiteindelijk ingediende data de eerder ingediende data overschrijft, wat leidt tot het verlies van de update.

Lang verhaal kort, hier zijn manieren om te voorkomen dat je updates verliest:

Gebruik de tijdstempel RowsVersion.

Als een rij inconsistent is met de waarde vóór het lezen, betekent dit dat een andere transactie deze kolom heeft bijgewerkt, zodat deze kolom niet kan worden bijgewerkt, waardoor het verlies van updates wordt voorkomen.



Voeg tenslotte de broncode bij:
CodeFirstDemo.rar (4.94 KB, Aantal downloads: 13)




Vorig:Nhibernate Native primaire sleutelgeneratiebeleid
Volgend:EF6 gebruikt Database.BeginTransaction om transacties te beheren
Geplaatst op 22-03-2022 11:51:38 |
Bedankt voor het harde werk, heel goed bericht
 Huisbaas| Geplaatst op 01-11-2023 20:42:15 |
EF gelijktijdigheidsuitzondering DbUpdateConcurrencyException vraagt de gecachte waarde op
https://www.itsvse.com/thread-10692-1-1.html
 Huisbaas| Geplaatst op 27-12-2023 19:54:01 |
EF Core optimistische lock rowversion gegenereerde migratiestatements




Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com