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.
Adja meg vagy módosítsa UpdateCheck az objektummodell beállításait.
További információ: Hogyan: Adja meg, hogy mely tagok legyenek tesztelve egyidejűségi ütközésekhez.
A hívás SubmitChangestry/catch blokkjában adja meg, hogy a kivételek mikor legyenek elvetve.
További információ : Az egyidejűségi kivételek kivetésének megadása.
Határozza meg, hogy mennyi ütközési részletet szeretne lekérni, és ennek megfelelően foglalja bele a kódot a próba-/fogási blokkba.
További információ : Az entitásütközés adatainak lekérése és a tagok ütközési adatainak lekérése.
Adja meg a
try
/catch
kódban, hogyan szeretné feloldani a felderített ütközéseket.További információ : Ütközések feloldása az adatbázis értékeinek megőrzésével, Az ütközések feloldása adatbázisértékek felülírásával, valamint az ütközések feloldása adatbázisértékekkel egyesítéssel.
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: