Megosztás a következőn keresztül:


Optimista egyidejűség: Áttekintés

A LINQ to SQL támogatja az optimista egyidejűség-vezérlést. Az alábbi táblázat a LINQ optimista egyidejűségére vonatkozó kifejezéseket ismerteti az SQL dokumentációjában:

Feltételek Leírás
Konkurencia Az a helyzet, amikor két vagy több felhasználó egyszerre próbálja frissíteni ugyanazt az adatbázissort.
egyidejűségi ütközés Az a helyzet, amikor két vagy több felhasználó egyszerre próbál ütköző értékeket küldeni egy sor egy vagy több oszlopához.
egyidejűség-vezérlés Az egyidejűségi ütközések feloldására használt technika.
optimista egyidejűség-vezérlés Az a technika, amely először azt vizsgálja, hogy más tranzakciók módosították-e az értékeket egy sorban a módosítások elküldése előtt.

Kontraszt a pesszimista egyidejűség-vezérléssel, amely zárolja a rekordot az egyidejűségi ütközések elkerülése érdekében.

Az optimista vezérlést azért nevezik így, mert valószínűnek tartja, hogy az egyik tranzakció megzavarja a másikat.
ütközésfeloldás Az ütköző elemek frissítésének folyamata az adatbázis ismételt lekérdezésével, majd a különbségek egyeztetésével.

Egy objektum frissítésekor a LINQ-ról SQL-változáskövetőre a következő adatok kerülnek:

- Az eredetileg az adatbázisból vett és a frissítés ellenőrzéséhez használt értékek.
– A következő lekérdezés új adatbázis-értékei.

A LINQ és az SQL ezután meghatározza, hogy az objektum ütközésben van-e (vagyis hogy egy vagy több tagérték módosult-e). Ha az objektum ütközésben van, a linq to SQL ezután meghatározza, hogy melyik tagja ütközik.

Az SQL LINQ által felderített tagütközések hozzáadva lesznek egy ütközési listához.

A LINQ–SQL-objektummodellben optimista egyidejűségi ütközés lép fel, ha az alábbi feltételek mindegyike teljesül:

  • Az ügyfél megpróbál módosításokat küldeni az adatbázisba.

  • Az ügyfél legutóbbi olvasása óta legalább egy frissítés-ellenőrzési érték frissült az adatbázisban.

Az ütközés feloldása magában foglalja az objektum ütközésének felderítését, majd annak eldöntését, hogy mit szeretne tenni vele.

Feljegyzés

Csak az optimista egyidejűségi ellenőrzésekben leképezett Always vagy WhenChanged részt vevő tagok vehetnek részt. Nem történik ellenőrzés a megjelölt Nevertagoknál. További információ: UpdateCheck.

Példa

Az alábbi forgatókönyvben például az 1. felhasználó elkezdi előkészíteni a frissítést az adatbázis lekérdezésével egy sorra. Az 1. felhasználó egy Alfreds, Maria és Sales értékeket tartalmazó sort kap.

Az 1. felhasználó a Manager oszlop értékét Alfred értékre, a Részleg oszlop értékét pedig marketingre szeretné módosítani. Mielőtt a Felhasználó1 elküldené ezeket a módosításokat, a User2 módosításokat küldött az adatbázisba. Így a Segéd oszlop értéke Máriára, a Részleg oszlop értéke pedig Szolgáltatásra módosult.

Amikor az 1. felhasználó megpróbálja elküldeni a módosításokat, a beküldés sikertelen lesz, és ChangeConflictException kivétel lép fel. Ez az eredmény azért fordul elő, mert a Segéd és a Részleg oszlop adatbázis-értékei nem a várt értékek. A Segéd és a Részleg oszlopot képviselő tagok ütköznek. Az alábbi táblázat összefoglalja a helyzetet.

Állapot Kezelő Segéd Részleg
Eredeti állapot Alfrédok Maria Sales
Felhasználó1 Alfred Marketing
Felhasználó2 Mary Szolgáltatás

Az ilyen ütközéseket különböző módokon oldhatja meg. További információ : A változásütközések kezelése.

Ütközésészlelés és -feloldás ellenőrzőlista

Az ütközéseket bármilyen részletességi szinten észlelheti és feloldhatja. Egy szélsőséges esetben az összes ütközést háromféleképpen oldhatja meg (lásd RefreshMode) további megfontolandó szempontok nélkül. A másik szélső esetben minden ütközéstípushoz megadhat egy adott műveletet az ütközésben lévő összes tag esetében.

LINQ–SQL-típusok, amelyek támogatják az ütközések felderítését és feloldását

A LINQ-ból SQL-be történő optimista egyidejűségben előforduló ütközések feloldását támogató osztályok és funkciók a következők:

Lásd még