Share via


Optimistisk samtidighet: Översikt

LINQ till SQL stöder optimistisk samtidighetskontroll. I följande tabell beskrivs termer som gäller för optimistisk samtidighet i LINQ till SQL-dokumentation:

Villkor beskrivning
samtidighet Situationen där två eller flera användare samtidigt försöker uppdatera samma databasrad.
samtidighetskonflikt Den situation där två eller flera användare samtidigt försöker skicka motstridiga värden till en eller flera kolumner i en rad.
samtidighetskontroll Den teknik som används för att lösa samtidighetskonflikter.
optimistisk samtidighetskontroll Tekniken som först undersöker om andra transaktioner har ändrat värden i en rad innan ändringar kan skickas.

Jämför med pessimistisk samtidighetskontroll, som låser posten för att undvika samtidighetskonflikter.

Optimistisk kontroll kallas så eftersom den anser att risken för att en transaktion stör en annan är osannolik.
Konfliktlösning Processen att uppdatera ett objekt som är i konflikt genom att fråga databasen igen och sedan förena skillnader.

När ett objekt uppdateras innehåller linq-till-SQL-ändringsspåraren följande data:

– De värden som ursprungligen hämtades från databasen och som användes för uppdateringskontrollen.
– De nya databasvärdena från den efterföljande frågan.

LINQ till SQL avgör sedan om objektet är i konflikt (dvs. om ett eller flera av dess medlemsvärden har ändrats). Om objektet är i konflikt avgör LINQ till SQL sedan vilka av dess medlemmar som är i konflikt.

Alla medlemskonflikter som LINQ till SQL identifierar läggs till i en konfliktlista.

I LINQ till SQL-objektmodellen uppstår en optimistisk samtidighetskonflikt när båda följande villkor är uppfyllda:

  • Klienten försöker skicka ändringar till databasen.

  • Ett eller flera uppdateringskontrollvärden har uppdaterats i databasen sedan klienten senast läste dem.

Lösningen på den här konflikten omfattar att identifiera vilka medlemmar i objektet som är i konflikt och sedan bestämma vad du vill göra åt det.

Kommentar

Endast medlemmar som mappas som Always eller WhenChanged deltar i optimistiska samtidighetskontroller. Ingen kontroll utförs för medlemmar som har markerats Never. Mer information finns i UpdateCheck.

Exempel

I följande scenario börjar Till exempel User1 förbereda en uppdatering genom att fråga databasen efter en rad. User1 tar emot en rad med värden för Alfreds, Maria och Sales.

User1 vill ändra värdet för kolumnen Manager till Alfred och värdet för kolumnen Avdelning till Marknadsföring. Innan User1 kan skicka ändringarna har User2 skickat ändringar till databasen. Så nu har värdet för kolumnen Assistent ändrats till Mary och värdet för kolumnen Avdelning till Tjänst.

När User1 nu försöker skicka ändringar misslyckas överföringen och ett ChangeConflictException undantag genereras. Det här resultatet beror på att databasvärdena för kolumnen Assistent och kolumnen Avdelning inte är de som förväntades. Medlemmar som representerar kolumnerna Assistent och Avdelning är i konflikt. I följande tabell sammanfattas situationen.

Tillstånd Ansvarig Assistent Avdelning
Ursprungligt tillstånd Alfreds Maria Sales
Användare1 Alfred Marketing
Användare2 Mary Tjänst

Du kan lösa konflikter som detta på olika sätt. Mer information finns i Så här hanterar du ändringskonflikter.

Checklista för konfliktidentifiering och lösning

Du kan identifiera och lösa konflikter på valfri detaljnivå. På ett extremt sätt kan du lösa alla konflikter på ett av tre sätt (se RefreshMode) utan ytterligare hänsyn. I den andra extremiteten kan du ange en specifik åtgärd för varje typ av konflikt för varje medlem i konflikt.

LINQ till SQL-typer som stöder konfliktidentifiering och lösning

Klasser och funktioner som stöder lösning av konflikter i optimistisk samtidighet i LINQ till SQL innehåller följande:

Se även