Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Az optimista egyidejűség abból az optimista feltételezésből ered, hogy a tranzakciók közötti ütközések ritkán fordulnak elő; A rendszer azt mondja, hogy ütközés történt, amikor egy másik tranzakció frissít vagy töröl egy adatsort az aktuális tranzakció olvasása és a frissítés vagy törlés időpontja között. Ez a pesszimista egyidejűség vagy zárolás ellentéte, amelyben az alkalmazás fejlesztője úgy véli, hogy az ilyen ütközések gyakoriak.
Optimista párhuzamosság esetén a sor nincs zárolva, amíg el nem jön a frissítés vagy a törlés ideje. Ezen a ponton a sor újraolvasásra kerül és ellenőrzésre kerül, hogy ellenőrizzük, módosult-e az utolsó olvasás óta. Ha a sor megváltozott, a frissítés vagy a törlés sikertelen lesz, és újra kell próbálkoznia.
Annak megállapításához, hogy egy sor módosult-e, az új verziót a rendszer a sor gyorsítótárazott verziójával ellenőrzi. Ez az ellenőrzés a sor verzióján alapulhat, például az SQL Server időbélyegoszlopán vagy a sor egyes oszlopainak értékein. Számos adatbázis-kezelő rendszer nem támogatja a sorverziókat.
Az optimista egyidejűséget az adatforrás vagy az alkalmazás implementálhatja. Az alkalmazásnak mindkét esetben alacsony tranzakcióelkülönítési szintet kell használnia, például a Read Committed szintet; egy magasabb szint használata semmisíti meg az optimista egyidejűség használatával szerzett megnövekedett egyidejűséget.
Ha az adatforrás optimista egyidejűséget valósít meg, az alkalmazás a SQL_ATTR_CONCURRENCY utasítás attribútumot SQL_CONCUR_ROWVER vagy SQL_CONCUR_VALUES értékre állítja. Egy sor frissítéséhez vagy törléséhez egy pozícióban lévő frissítési vagy törlési utasítást hajt végre, vagy meghívja az SQLSetPos-t ugyanúgy, mint a pesszimista egyidejűség esetén; az illesztőprogram vagy az adatforrás az SQLSTATE 01001 -et (kurzorművelet ütközését) adja vissza, ha a frissítés vagy a törlés ütközés miatt meghiúsul.
Ha maga az alkalmazás optimista egyidejűséget valósít meg, a SQL_ATTR_CONCURRENCY utasítás attribútumot SQL_CONCUR_READ_ONLY értékre állítja be egy sor olvasásához. Ha összehasonlítja a sorverziókat, és nem ismeri a sorverzió oszlopát, meghívja az SQLSpecialColumns függvényt az SQL_ROWVER beállítással az oszlop nevének meghatározásához.
Az alkalmazás frissíti vagy törli a sort úgy, hogy megnöveli a párhuzamos hozzáférést a SQL_CONCUR_LOCK-ra (hogy írási hozzáférést szerezzen a sorhoz), és végrehajt egy UPDATE vagy DELETE utasítást egy WHERE záradékkal, amely meghatározza a sor verzióját vagy értékeit, amikor az alkalmazás azt olvasta. Ha a sor azóta módosult, az utasítás sikertelen lesz. Ha a WHERE záradék nem azonosítja egyedileg a sort, az utasítás más sorokat is frissíthet vagy törölhet; A sorverziók mindig egyedileg azonosítják a sorokat, a sorértékek azonban csak akkor azonosítják a sorokat, ha az elsődleges kulcsot tartalmazzák.