Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 42676|Odpoveď: 4

[Zdroj] Riešenie rozdielov medzi súbežnými časovými pečiatkami a ConcurrencyCheck

[Kopírovať odkaz]
Zverejnené 8. 4. 2017 0:10:50 | | | |


Autorwww.itsvse.com @小渣渣 !
Úspešne vložte základné údaje!
Testovanie funkcie ConcurrencyCheck je dokončené
Aktualizácia úspešná! Poznámka 1
Aktualizácia je výnimočná! Poznámka 2, abnormálne informácie! Príkazy Uložiť aktualizovať, vložiť alebo vymazať ovplyvnili neočakávaný počet riadkov (0). Entity mohli byť modifikované alebo vymazané od načítania entít. Pozri http://go.microsoft.com/fwlink/?LinkId=472540 pre informácie o pochopení a riešení výnimiek optimistickej súbežnosti.

Otestujte rozdiel medzi Timestamp a ConcurrencyCheck
Aktualizácia UpdateTab1 úspešná! Názov 1
Aktualizácia UpdateTab2 úspešná! Názov 1
Aktualizácia UpdateTab2 je nezvyčajná! Meno 2, abnormálne informácie! Príkazy Uložiť aktualizovať, vložiť alebo vymazať ovplyvnili neočakávaný počet riadkov (0). Entity mohli byť modifikované alebo vymazané od načítania entít. Pozri http://go.microsoft.com/fwlink/?LinkId=472540 pre informácie o pochopení a riešení výnimiek optimistickej súbežnosti.
Aktualizácia UpdateTab1 úspešná! Názov 2

【TimeStamp】
Funkcia TimeStamp sa dá aplikovať na triedu poľa, ktorá má len jednu vlastnosť bajtového poľa, a táto funkcia nastavuje typ tiemStamp na stĺpec. Pri súbežných kontrolách Code-First automaticky používa toto pole typu TimeStamp.

【ConcurrencyCheck】
Funkcia ConcurrencyCheck sa dá aplikovať na vlastnosti doménovej triedy. Keď EF vykoná aktualizačnú operáciu, Code-First vloží hodnotu stĺpca do príkazu where condition a túto funkciu CurrencyCheck môžete použiť na použitie existujúcich stĺpcov na kontrolu súbežnosti, namiesto samostatného stĺpca TimeStamp na kontrolu súbežnosti.

Začnime vytvorením nového kontextového objektu, ktorý ukáže rozdiel medzi Timestamp a ConcurrencyCheck v procese súbežnosti!

Tu je kód pre kontext:




Pozrime sa na stĺpce databázy, nasledovne:



Zistíme, že tab1 a tab2 majú stĺpce Id, Name a Remark, a tab2 má viac stĺpcov Riadková verzia než tab1.

Najskôr priložte testovací kód:



【ConcurrencyCheck Principle】



Funkciu ConcurrencyCheck sme pridali do vlastnosti Remark v Tab1,


Keď aktualizujeme hodnotu atribútu Name tých istých dát súčasne, žiadna výnimka sa nevytvára!


Generujte SQL príkazy:


exec sp_executesql N'UPDATE [dbo]. [Tab1]
SET [Meno] = @0
KDE (([Id] = @1) A ([Poznámka] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'name1',@1=1,@2=N'Note1'
exec sp_executesql N'UPDATE [dbo]. [Tab1]
SET [Meno] = @0
KDE (([Id] = @1) A ([Poznámka] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'name2',@1=1,@2=N'note1'

Keď aktualizujeme hodnotu vlastnosti Remark pre tie isté dáta súčasne, hodíme výnimku!

Generujte SQL príkazy:

exec sp_executesql N'UPDATE [dbo]. [Tab1]
NASTAVIŤ [Poznámka] = @0
KDE (([Id] = @1) A ([Poznámka] = @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]
NASTAVIŤ [Poznámka] = @0
KDE (([Id] = @1) A ([Poznámka] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Note 2',@1=1,@2=N'Note'

Zistili sme, že ak vezmeme rovnakú časť dát s Id 1 súčasne, dostaneme hodnotu atribútu Remark, a pri aktualizácii atribútu Remark použijeme Remark ako podmienku aktualizácie.

Prvý sql príkaz je možné úspešne aktualizovať, potom sa poznámka zmení na "note 1" a keď sa aktualizuje druhý sql príkaz, aktualizácia zlyhá, pretože hodnota poznámky sa zmenila.

【Princíp časovej pečiatky】

Pridali sme vlastnosť RowVersion do Tab2 (môžete si vziať akékoľvek meno) a pridali sme funkciu časovej pečiatky!!



Keď aktualizujeme hodnotu Name tých istých dát súčasne, prvá aktualizácia uspeje, druhá zlyhá a vyhodí sa výnimka, pozrime sa na vygenerovaný SQL kód!

exec sp_executesql N'UPDATE [dbo]. [Tab2]
SET [Meno] = @0
KDE ((([Id] = @1) AND ([RowVersion] = @2)) AND ([Poznámka] = @3))
VYBRAŤ [RowVersion]
FROM [dbo]. [Tab2]
KDE @@ROWCOUNT > 0 A [Id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binárne(8),@3 nvarchar(max) ',@0=N'Name1',@1=1,@2=0x00000000000007D1,@3=N'Note'
exec sp_executesql N'UPDATE [dbo]. [Tab2]
SET [Meno] = @0
KDE ((([Id] = @1) AND ([RowVersion] = @2)) AND ([Poznámka] = @3))
VYBRAŤ [RowVersion]
FROM [dbo]. [Tab2]
KDE @@ROWCOUNT > 0 A [Id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binárne(8),@3 nvarchar(max) ',@0=N'name2',@1=1,@2=0x00000000000007D1,@3=N'Note'

Pri vykonávaní druhého SQL príkazu, pretože údaje z podmienok where už nie sú dostupné, aktualizácia zlyhá a vyhodí sa výnimka!!

Po úspešnom vykonaní prvého SQL príkazu sa hodnota RowVersion zmení, ako je znázornené na obrázku nižšie:





RowsVersion je časová značka

Obchádzka pre chýbajúce aktualizácie   

Koncept chýbajúcich aktualizácií: Keď používatelia upravujú riadok dát súčasne, najprv si ich prečítajú, umiestnia na front-end na úpravu a potom odošlú údaje po úprave, takže finálne odoslané dáta prepíšu predtým odoslané dáta, čo spôsobí stratu aktualizácie.

Stručne povedané, tu sú spôsoby, ako predísť strate aktualizácií:

Použite časovú značku RowsVersion.

Ak je riadok nekonzistentný s hodnotou pred čítaním, znamená to, že iná transakcia aktualizovala tento stĺpec, takže tento stĺpec sa nedá aktualizovať, čím sa zabraňuje strate aktualizácií.



Nakoniec pripojte zdrojový kód:
CodeFirstDemo.rar (4.94 KB, Počet stiahnutí: 13)




Predchádzajúci:Nhibernate natívna politika generovania primárnych kľúčov
Budúci:EF6 používa Database.BeginTransaction na správu transakcií
Zverejnené 22. 3. 2022 11:51:38 |
Ďakujem za tvrdú prácu, veľmi dobrý príspevok
 Prenajímateľ| Zverejnené 1. 11. 2023 20:42:15 |
Výnimka EF súbežnosti DbUpdateConcurrencyException sa dotazuje na uloženú hodnotu
https://www.itsvse.com/thread-10692-1-1.html
 Prenajímateľ| Zverejnené 27. 12. 2023 19:54:01 |
EF Core optimistic lock rowversion generoval migračné príkazy




Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com