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