Avtorwww.itsvse.com @小渣渣 ! Uspešno vstavite osnovne podatke! Testiranje funkcije ConcurrencyCheck je zaključeno Posodobitev uspešna! Opomba 1 Posodobitev je izjemna! Opomba 2, nenavadne informacije! Stavek 'posodobi', vstavi ali izbriši 'shrani' je vplival na nepričakovano število vrstic (0). Entitete so morda bile spremenjene ali izbrisane od nalaganja entitet. Oglejte si http://go.microsoft.com/fwlink/?LinkId=472540 za informacije o razumevanju in ravnanju z izjemami optimistične sočasnosti.
Preizkusite razliko med Timestamp in ConcurrencyCheck Posodobitev UpdateTab1 uspešna! Ime 1 Posodobitev Tab2 uspešna! Ime 1 Posodobitev UpdateTab2 je nenavadna! Ime 2, nenavadne informacije! Stavek 'posodobi', vstavi ali izbriši 'shrani' je vplival na nepričakovano število vrstic (0). Entitete so morda bile spremenjene ali izbrisane od nalaganja entitet. Oglejte si http://go.microsoft.com/fwlink/?LinkId=472540 za informacije o razumevanju in ravnanju z izjemami optimistične sočasnosti. Posodobitev UpdateTab1 uspešna! Ime 2
【Časovni žig】 Funkcijo TimeStamp je mogoče uporabiti za razred polja, ki ima le eno bajtno polje, in ta funkcija nastavi tip tiemStamp na stolpec. Pri sočasnih preverjanjih Code-First samodejno uporablja to polje tipa TimeStamp.
【ConcurrencyCheck】 Funkcijo ConcurrencyCheck je mogoče uporabiti za lastnosti domenskega razreda. Ko EF izvede posodobitev operacijo, Code-First vpiše vrednost stolpca v stavek where condition, in to funkcijo CurrencyCheck lahko uporabite za uporabo obstoječih stolpcev za preverjanje sočasnosti, namesto da bi uporabljali ločen stolpec TimeStamp za preverjanje sočasnosti.
Začnimo z ustvarjanjem novega kontekstnega objekta, ki bo pokazal razliko med Timestamp in ConcurrencyCheck v sočasnem procesiranju!
Tukaj je koda za kontekst:
Poglejmo si stolpce baze podatkov, kot sledi:
Ugotovili bomo, da imata tab1 in tab2 stolpce ID, Ime in Opomba, tab2 pa več stolpcov Različica vrstice kot tab1.
Najprej priložite testno kodo:
【Načelo sočasnosti】
Funkcijo ConcurrencyCheck smo dodali k lastnosti Remark v Tab1,
Ko istočasno posodobimo vrednost atributa Name za iste podatke, ni nobene izjeme!
Generirajte SQL stavke:
izvršni sp_executesql N'UPDATE [dbo]. [Tab1] SET [Ime] = @0 KJER (([Id] = @1) IN ([Opomba] = @2)) ',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'ime1',@1=1,@2=N'Note1' izvršni sp_executesql N'UPDATE [dbo]. [Tab1] SET [Ime] = @0 KJER (([Id] = @1) IN ([Opomba] = @2)) ',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'ime2',@1=1,@2=N'note1' Ko istočasno posodobimo vrednost lastnosti Remark za iste podatke, vržemo izjemo!
Generirajte SQL stavke:
izvršni sp_executesql N'UPDATE [dbo]. [Tab1] NASTAVI [Opomba] = @0 KJER (([Id] = @1) IN ([Opomba] = @2)) ',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Note1',@1=1,@2=N'Note' izvršni sp_executesql N'UPDATE [dbo]. [Tab1] NASTAVI [Opomba] = @0 KJER (([Id] = @1) IN ([Opomba] = @2)) ',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Note 2',@1=1,@2=N'Note' Ugotovimo lahko, da če istočasno vzamemo isti podatek z Id 1, dobimo vrednost atributa Remark, in ob posodobitvi atributa Remark uporabimo Remark kot pogoj za posodobitev.
Prvi SQL stavek je mogoče uspešno posodobiti, nato se opomba spremeni v "opomba 1", in ko se drugi SQL stavek posodobi, posodobitev ne uspe, ker se je vrednost opombe spremenila.
【Načelo časovnega žiga】
Dodali smo lastnost RowVersion v Tab2 (lahko vzamete katerokoli ime) in dodali funkcijo časovnega žiga!!
Ko hkrati posodobimo vrednost imena istih podatkov, prva posodobitev uspe, druga posodobitev ne uspe in se vrže izjema, poglejmo si generirano SQL kodo!
izvršni sp_executesql N'UPDATE [dbo]. [Tab2] SET [Ime] = @0 KJER ((([Id] = @1) IN ([RowVersion] = @2)) IN ([Opomba] = @3)) IZBERI [RowVersion] IZ [dbo]. [Tab2] KJER @@ROWCOUNT > 0 IN [Id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binarno(8),@3 nvarchar(max) ',@0=N'Name1',@1=1,@2=0x00000000000007D1,@3=N'Note' izvršni sp_executesql N'UPDATE [dbo]. [Tab2] SET [Ime] = @0 KJER ((([Id] = @1) IN ([RowVersion] = @2)) IN ([Opomba] = @3)) IZBERI [RowVersion] IZ [dbo]. [Tab2] KJER @@ROWCOUNT > 0 IN [Id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binarno(8),@3 nvarchar(max) ',@0=N'name2',@1=1,@2=0x00000000000007D1,@3=N'Note' Pri izvajanju drugega SQL stavka, ker podatkov stanja where ni več mogoče najti, posodobitev ne uspe in se vrže izjema!!
Ko je prvi SQL ukaz uspešno izveden, se vrednost RowVersion spremeni, kot je prikazano na spodnji sliki:
RowsVersion je časovni žig
Rešitev za manjkajoče posodobitve
Koncept manjkajočih posodobitev: Ko uporabniki istočasno spremenijo vrstico podatkov, najprej preberejo podatke, jih dodajo na sprednjo stran za spremembo in nato podatke ob spremembi pošljejo, tako da končno oddani podatki prepišejo prej oddane podatke, kar povzroči izgubo posodobitve.
Na kratko, tukaj je nekaj načinov, kako preprečiti izgubo posodobitev:
Uporabite časovni žig RowsVersion.
Če vrstica ni skladna z vrednostjo pred branjem, to pomeni, da je druga transakcija posodobila ta stolpec, tako da tega stolpca ni mogoče posodobiti, s čimer se prepreči izguba posodobitev.
Na koncu priložite izvorno kodo:
CodeFirstDemo.rar
(4.94 KB, Število prenosov: 13)
|