Optimistische gelijktijdigheid: overzicht
LINQ naar SQL ondersteunt optimistisch gelijktijdigheidsbeheer. In de volgende tabel worden termen beschreven die van toepassing zijn op optimistische gelijktijdigheid in LINQ naar SQL-documentatie:
Voorwaarden | Beschrijving |
---|---|
Concurrency | De situatie waarin twee of meer gebruikers tegelijkertijd proberen dezelfde databaserij bij te werken. |
Gelijktijdigheidsconflict | De situatie waarin twee of meer gebruikers tegelijkertijd proberen conflicterende waarden te verzenden naar een of meer kolommen van een rij. |
Gelijktijdigheidsbeheer | De techniek die wordt gebruikt om gelijktijdigheidsconflicten op te lossen. |
optimistisch gelijktijdigheidsbeheer | De techniek die eerst onderzoekt of andere transacties waarden in een rij hebben gewijzigd voordat wijzigingen kunnen worden verzonden. Contrast met pessimistisch gelijktijdigheidsbeheer, waarmee de record wordt vergrendeld om gelijktijdigheidsconflicten te voorkomen. Optimistische controle wordt zo aangeduid omdat de kans dat een transactie de kans op een transactie verstoort, onwaarschijnlijk is. |
Conflictoplossing | Het proces van het vernieuwen van een conflicterend item door opnieuw een query uit te voeren op de database en vervolgens de verschillen te combineren. Wanneer een object wordt vernieuwd, bevat de LINQ naar SQL-wijzigingstracker de volgende gegevens: - De waarden die oorspronkelijk uit de database zijn gehaald en worden gebruikt voor de updatecontrole. - De nieuwe databasewaarden uit de volgende query. LINQ naar SQL bepaalt vervolgens of het object conflicteert (dat wil gezegd, of een of meer van de lidwaarden zijn gewijzigd). Als het object conflicteert, bepaalt LINQ naar SQL vervolgens welke van de leden in conflict zijn. Elk lidconflict dat LINQ naar SQL detecteert, wordt toegevoegd aan een conflictlijst. |
In het OBJECTmodel LINQ naar SQL treedt een optimistisch gelijktijdigheidsconflict op wanneer aan beide van de volgende voorwaarden wordt voldaan:
De client probeert wijzigingen in de database in te dienen.
Een of meer waarden voor updatecontrole zijn bijgewerkt in de database sinds de client ze voor het laatst heeft gelezen.
Oplossing van dit conflict omvat het detecteren van welke leden van het object conflicteren en vervolgens beslissen wat u eraan wilt doen.
Notitie
Alleen leden die zijn toegewezen als Always of WhenChanged deelnemen aan optimistische gelijktijdigheidscontroles. Er wordt geen controle uitgevoerd voor leden die zijn gemarkeerd Never. Zie UpdateCheck voor meer informatie.
Opmerking
In het volgende scenario begint Gebruiker1 bijvoorbeeld met het voorbereiden van een update door een query uit te voeren op de database voor een rij. Gebruiker1 ontvangt een rij met waarden van Alfreds, Maria en Sales.
Gebruiker1 wil de waarde van de kolom Manager wijzigen in Alfred en de waarde van de kolom Afdeling in Marketing. Voordat Gebruiker1 deze wijzigingen kan indienen, heeft User2 wijzigingen naar de database verzonden. Nu is de waarde van de kolom Assistent gewijzigd in Mary en de waarde van de kolom Afdeling in Service.
Wanneer Gebruiker1 nu probeert wijzigingen in te dienen, mislukt de inzending en wordt er een ChangeConflictException uitzondering gegenereerd. Dit resultaat treedt op omdat de databasewaarden voor de kolom Assistent en de kolom Afdeling niet de waarden zijn die werden verwacht. Leden die de kolommen Assistent en Afdeling vertegenwoordigen, zijn in conflict. De volgende tabel bevat een overzicht van de situatie.
Provincie | Manager | Assistent | Afdeling |
---|---|---|---|
Oorspronkelijke staat | Alfreds | Maria | Verkoop |
User1 | Alfred | Marketing | |
User2 | Mary | Service |
U kunt conflicten zoals deze op verschillende manieren oplossen. Zie Voor meer informatie : Wijzigingsconflicten beheren.
Controlelijst voor conflictdetectie en -oplossing
U kunt conflicten op elk detailniveau detecteren en oplossen. Ten minste kunt u alle conflicten op drie manieren oplossen (zie RefreshMode) zonder extra overweging. Aan de andere kant kunt u een specifieke actie aanwijzen voor elk type conflict voor elk lid in conflict.
Geef opties op of wijzig deze UpdateCheck in uw objectmodel.
Zie Procedure voor meer informatie: Opgeven welke leden zijn getest op gelijktijdigheidsconflicten.
Geef in het try/catch-blok van uw aanroep op SubmitChangeswelk moment uitzonderingen moeten worden gegenereerd.
Zie Procedure: Opgeven wanneer gelijktijdigheidsonderzondering wordt gegenereerd voor meer informatie.
Bepaal hoeveel conflictdetails u wilt ophalen en neem code op in het try/catch-blok dienovereenkomstig.
Zie Procedure: Informatie over entiteitsconflicten ophalen en informatie over het ophalen van ledenconflicten voor meer informatie.
Neem in uw
try
/catch
code op hoe u de verschillende conflicten wilt oplossen die u detecteert.Zie Procedure: Conflicten oplossen door databasewaarden te behouden, Conflicten oplossen door databasewaarden op te lossen door databasewaarden te overschrijven en Procedures: Conflicten oplossen door samen te voegen met databasewaarden.
LINQ naar SQL-typen die ondersteuning bieden voor conflictdetectie en -oplossing
Klassen en functies ter ondersteuning van de oplossing van conflicten in optimistische gelijktijdigheid in LINQ naar SQL zijn onder andere: