Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 42676|Odpověď: 4

[Zdroj] Řešení rozlišení souběžného časového razítka a ConcurrencyCheck

[Kopírovat odkaz]
Zveřejněno 08.04.2017 0:10:50 | | | |


Autorwww.itsvse.com @小渣渣 !
Zadejte základní data úspěšně!
Testování funkce Concurrency Check je dokončeno
Aktualizace úspěšná! Poznámka 1
Aktualizace je výjimečná! Poznámka 2, abnormální informace! Příkazy aktualizace, vložení nebo mazání uložení ovlivnily neočekávaný počet řádků (0). Entity mohly být od načtení upraveny nebo smazány. Viz http://go.microsoft.com/fwlink/?LinkId=472540 pro informace o pochopení a řešení výjimek optimistické souběžnosti.

Otestujte rozdíl mezi Timestamp a ConcurrencyCheck
Aktualizace UpdateTab1 úspěšná! Jméno 1
Aktualizace UpdateTab2 úspěšná! Jméno 1
Aktualizace UpdateTab2 je neobvyklá! Jméno 2, abnormální informace! Příkazy aktualizace, vložení nebo mazání uložení ovlivnily neočekávaný počet řádků (0). Entity mohly být od načtení upraveny nebo smazány. Viz http://go.microsoft.com/fwlink/?LinkId=472540 pro informace o pochopení a řešení výjimek optimistické souběžnosti.
Aktualizace UpdateTab1 úspěšná! Název 2

【TimeStamp】
Funkci TimeStamp lze aplikovat na třídu pole, která má pouze jednu vlastnost pole bajtů, a tato funkce nastavuje typ tiemStamp na sloupec. Při souběžných kontrolách Code-First automaticky používá toto pole typu TimeStamp.

【ConcurrencyCheck】
Funkce ConcurrencyCheck lze aplikovat na vlastnosti doménové třídy. Když EF provede aktualizační operaci, Code-First vloží hodnotu sloupce do příkazu where condition a tuto funkci CurrencyCheck můžete použít k použití stávajících sloupců pro kontrolu souběžnosti, místo použití samostatného sloupce TimeStamp pro kontrolu souběžnosti.

Začněme vytvořením nového kontextového objektu, který ukáže rozdíl mezi Timestamp a Concurrency Check při zpracování souběžnosti!

Tady je kód pro kontext:




Podívejme se na sloupce databáze, a to následovně:



Zjistíme, že tabulátory 1 a 2 mají sloupce Id, Jméno a Poznámka, a záložka2 má více sloupců Verze řádku než záložka 1.

Nejprve přiložte testovací kód:



【Princip souběžnosti】



Přidali jsme funkci ConcurrencyCheck do vlastnosti Remark v Tab1,


Když aktualizujeme hodnotu atributu Name u stejných dat ve stejnou dobu, žádná výjimka se nehodí!


Generujte SQL příkazy:


exeec sp_executesql N'UPDATE [dbo]. [Tabulátor1]
SET [Jméno] = @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'
exeec sp_executesql N'UPDATE [dbo]. [Tabulátor1]
SET [Jméno] = @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'

Když aktualizujeme hodnotu vlastnosti Remark pro stejná data ve stejnou dobu, vyhodíme výjimku!

Generujte SQL příkazy:

exeec sp_executesql N'UPDATE [dbo]. [Tabulátor1]
SET [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'
exeec sp_executesql N'UPDATE [dbo]. [Tabulátor1]
SET [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'

Zjistíme, že pokud vezmeme stejný údaj s Id 1 současně, získáme hodnotu atributu Remark, a při aktualizaci atributu Remark použijeme Remark jako podmínku aktualizace.

První SQL příkaz lze úspěšně aktualizovat, poté se poznámka změní na "poznámka 1" a když se aktualizuje druhý SQL příkaz, aktualizace selže, protože se změnila hodnota poznámky.

【Princip časového razítka】

Do Tab2 jsme přidali vlastnost RowVersion (můžete si vzít libovolné jméno) a přidali jsme funkci časové značky!!



Když aktualizujeme hodnotu Name stejných dat současně, první aktualizace uspěje, druhá selže a je vyhodena výjimka, podívejme se na vygenerovaný SQL kód!

exeec sp_executesql N'UPDATE [dbo]. [Tabulátor 2]
SET [Jméno] = @0
KDE ((([Id] = @1) AND ([RowVersion] = @2)) AND ([Poznámka] = @3))
VYBRAT [RowVersion]
FROM [dbo]. [Tabulátor 2]
KDE @@ROWCOUNT > 0 A [Id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binární(8),@3 nvarchar(max) ',@0=N'Name1',@1=1,@2=0x00000000000007D1,@3=N'Note'
exeec sp_executesql N'UPDATE [dbo]. [Tabulátor 2]
SET [Jméno] = @0
KDE ((([Id] = @1) AND ([RowVersion] = @2)) AND ([Poznámka] = @3))
VYBRAT [RowVersion]
FROM [dbo]. [Tabulátor 2]
KDE @@ROWCOUNT > 0 A [Id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binární(8),@3 nvarchar(max) ',@0=N'name2',@1=1,@2=0x00000000000007D1,@3=N'Note'

Při vykonání druhého SQL příkazu, protože data podmínky where již nelze najít, aktualizace selže a je vyhozena výjimka!!

Po úspěšném spuštění prvního SQL příkazu se změní hodnota RowVersion, jak je znázorněno na obrázku níže:





RowsVersion je časové razítko

Řešení chybějících aktualizací   

Koncept chybějících aktualizací: Když uživatelé současně upravují řádek dat, nejprve data čtou, uloží je na front-end k úpravě a poté data odešlou při úpravě, takže konečná odeslaná data přepíšou dříve odeslaná data, což způsobí ztrátu aktualizace.

Stručně řečeno, zde jsou způsoby, jak zabránit ztrátě aktualizací:

Použijte časové razítko RowsVersion.

Pokud je řádek před čtením nekonzistentní s hodnotou, znamená to, že jiná transakce tento sloupec aktualizovala, takže tento sloupec nelze aktualizovat, čímž se zabrání ztrátě aktualizací.



Nakonec přiložte zdrojový kód:
CodeFirstDemo.rar (4.94 KB, Počet stažení: 13)




Předchozí:Nhibernate native primární generování klíčů
Další:EF6 používá Database.BeginTransaction ke správě transakcí
Zveřejněno 22.03.2022 11:51:38 |
Díky za tvrdou práci, velmi dobrý příspěvek
 Pronajímatel| Zveřejněno 01.11.2023 20:42:15 |
EF výjimka pro souběžnost DbUpdateConcurrencyException znovu dotazuje uloženou hodnotu
https://www.itsvse.com/thread-10692-1-1.html
 Pronajímatel| Zveřejněno 27.12.2023 19:54:01 |
EF Core optimistické zámekové řádkové příkazy generovaly migrační příkazy




Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com