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.
Ange eller ändra UpdateCheck alternativ i objektmodellen.
Mer information finns i Så här: Ange vilka medlemmar som ska testas för samtidighetskonflikter.
I try/catch-blocket för anropet till SubmitChangesanger du vid vilken tidpunkt du vill att undantag ska genereras.
Mer information finns i Så här anger du när samtidighetsfel genereras.
Ta reda på hur mycket konfliktinformation du vill hämta och inkludera kod i try/catch-blocket i enlighet med detta.
Mer information finns i How to: Retrieve Entity Conflict Information and How to: Retrieve Member Conflict Information (Hämta entitetskonfliktsinformation och Så här hämtar du information om medlemskonflikter).
Inkludera i koden
try
/catch
hur du vill lösa de olika konflikter som du upptäcker.Mer information finns i Så här löser du konflikter genom att behålla databasvärden, Så här löser du konflikter genom att skriva över databasvärden och Så här löser du konflikter genom att slå samman med databasvärden.
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: