Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Optymistyczna współbieżność wynika z optymistycznego założenia, że rzadko występują kolizje między transakcjami; Mówi się, że doszło do kolizji, gdy inna transakcja aktualizuje lub usuwa wiersz danych między czasem jego odczytu przez bieżącą transakcję i czas jego aktualizacji lub usunięcia. Jest to przeciwieństwo pesymistycznej współbieżności lub blokowania, gdzie deweloper aplikacji uważa, że takie kolizje są powszechne.
W optymistycznej współbieżności wiersz pozostaje bez blokady do czasu aktualizacji lub usunięcia. W tym momencie wiersz jest ponownie odczytywany i sprawdzany, aby sprawdzić, czy został on zmieniony od czasu ostatniego odczytania. Jeśli wiersz uległ zmianie, aktualizacja lub usunięcie zakończy się niepowodzeniem i należy ponowić próbę.
Aby określić, czy wiersz został zmieniony, jego nowa wersja jest sprawdzana względem buforowanej wersji wiersza. To sprawdzanie może być oparte na wersji wiersza, takiej jak kolumna sygnatury czasowej w programie SQL Server lub wartości każdej kolumny w wierszu. Wiele zestawów DBMS nie obsługuje wersji wierszy.
Optymistyczna współbieżność może zostać zaimplementowana przez źródło danych lub aplikację. W obu przypadkach aplikacja powinna używać niskiego poziomu izolacji transakcji, takiego jak "Read Committed"; użycie wyższego poziomu neguje zwiększoną współbieżność uzyskaną poprzez optymistyczną współbieżność.
Jeśli źródło danych implementuje optymistyczną współbieżność, aplikacja ustawia atrybut instrukcji SQL_ATTR_CONCURRENCY na SQL_CONCUR_ROWVER lub SQL_CONCUR_VALUES. Aby zaktualizować lub usunąć wiersz, wykonuje pozycjonowaną instrukcję aktualizacji lub usuwania albo wywołuje SQLSetPos tak samo jak w przypadku pesymistycznej współbieżności; sterownik lub źródło danych zwraca błąd SQLSTATE 01001 (konflikt operacji kursora), jeśli aktualizacja lub usunięcie nie powiedzie się z powodu kolizji.
Jeśli sama aplikacja implementuje optymistyczną współbieżność, ustawia atrybut instrukcji SQL_ATTR_CONCURRENCY na SQL_CONCUR_READ_ONLY, aby odczytać wiersz. Jeśli porównuje wersje wierszy i nie zna kolumny wersji wiersza, wywołuje metodę SQLSpecialColumns z opcją SQL_ROWVER w celu określenia nazwy tej kolumny.
Aplikacja aktualizuje lub usuwa wiersz, zwiększając współbieżność do poziomu SQL_CONCUR_LOCK (aby uzyskać dostęp do zapisu tego wiersza) i wykonując instrukcję UPDATE lub DELETE z klauzulą WHERE, która określa wersję lub wartości wiersza z momentu, gdy aplikacja go odczytała. Jeśli od tego czasu wiersz uległ zmianie, instrukcja zakończy się niepowodzeniem. Jeśli klauzula WHERE nie identyfikuje unikatowo wiersza, instrukcja może również zaktualizować lub usunąć inne wiersze; wersje wierszy zawsze jednoznacznie identyfikują wiersze, ale wartości wierszy jednoznacznie identyfikują wiersze tylko wtedy, gdy zawierają klucz podstawowy.