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)
|