W przypadku konfliktów masz dwie opcje:
- Możesz spróbować uniknąć konfliktu i właśnie to robi Blokowanie Pesymistyczne.
- Możesz też zezwolić na wystąpienie konfliktu, ale musisz go wykryć po zatwierdzeniu transakcji i tak właśnie działa Optymistyczne Blokowanie.
Teraz rozważmy następującą anomalię utraconej aktualizacji :
Anomalia utraconej aktualizacji może wystąpić na poziomie izolacji Read Committed .
Na powyższym schemacie możemy zobaczyć, że Alice wierzy, że może wypłacić 40, account
ale nie zdaje sobie sprawy, że Bob właśnie zmienił saldo konta, a teraz na koncie pozostało tylko 20.
Blokowanie pesymistyczne
Blokowanie pesymistyczne osiąga ten cel, biorąc na koncie blokadę współdzieloną lub blokadę odczytu, dzięki czemu Bob nie może zmienić konta.
Na powyższym schemacie zarówno Alice, jak i Bob uzyskają blokadę odczytu w account
wierszu tabeli, którą przeczytali obaj użytkownicy. Baza danych nabywa te blokady na SQL Server, gdy używa się powtarzalnego odczytu lub szeregowego.
Ponieważ zarówno Alice, jak i Bob odczytali account
wartość PK 1
, żaden z nich nie może jej zmienić, dopóki jeden użytkownik nie zwolni blokady odczytu. Wynika to z faktu, że operacja zapisu wymaga akwizycji blokad zapisu / wyłączności, a blokady współdzielone / odczytu zapobiegają blokowaniu zapisu / wyłączności.
Dopiero po zatwierdzeniu transakcji przez Alicję i zwolnieniu blokady odczytu w account
wierszu, Bob UPDATE
wznowi i zastosuje zmianę. Dopóki Alice nie zwolni blokady odczytu, UPDATE Boba blokuje.
Aby uzyskać więcej informacji o tym, w jaki sposób ramy dostępu do danych korzystają z pesymistycznej obsługi blokowania baz danych, zobacz ten artykuł .
Optymistyczne blokowanie
Optymistyczne blokowanie pozwala na wystąpienie konfliktu, ale wykrywa go po zastosowaniu AKTUALIZACJI Alicji po zmianie wersji.
Tym razem mamy dodatkową version
kolumnę. version
Kolumna jest zwiększany za każdym razem, aktualizacji lub usuwania jest wykonywana, a to jest również wykorzystywane w klauzuli WHERE w UPDATE i DELETE. Aby to zadziałało, musimy wydać WYBIERZ i odczytać prąd version
przed wykonaniem UPDATE lub DELETE, ponieważ w przeciwnym razie nie wiedzielibyśmy, jaką wartość wersji przekazać do klauzuli WHERE lub zwiększyć.
Aby uzyskać więcej informacji o tym, jak struktury dostępu do danych implementują optymistyczne blokowanie, zapoznaj się z tym artykułem .
Transakcje na poziomie aplikacji
Systemy relacyjnych baz danych pojawiły się pod koniec lat 70. na początku lat 80., gdy klient zazwyczaj łączył się z komputerem mainframe za pośrednictwem terminala. Dlatego wciąż widzimy, że systemy baz danych definiują terminy, takie jak ustawienie SESSION.
Obecnie przez Internet nie wykonujemy już operacji odczytu i zapisu w kontekście tej samej transakcji z bazą danych, a ACID nie jest już wystarczający.
Rozważmy na przykład następujący przypadek użycia:
Bez optymistycznego blokowania nie ma szans na złapanie tej Utraconej aktualizacji, nawet jeśli transakcje bazy danych wykorzystywałyby Serializable. Wynika to z tego, że odczyty i zapisy są wykonywane w osobnych żądaniach HTTP, a więc w różnych transakcjach w bazie danych.
Tak więc optymistyczne blokowanie może pomóc w zapobieganiu Utraconym aktualizacjom nawet podczas korzystania z transakcji na poziomie aplikacji, które uwzględniają również czas myślenia użytkownika.
Więcej informacji na temat transakcji na poziomie aplikacji lub transakcji logicznych można znaleźć w tym artykule .
Wniosek
Blokowanie optymistyczne jest bardzo przydatną techniką i działa dobrze nawet przy użyciu mniej rygorystycznych poziomów izolacji, takich jak odczyt zatwierdzony lub gdy odczyty i zapisy są wykonywane w kolejnych transakcjach bazy danych.
Wadą optymistycznego blokowania jest to, że ramy dostępu do danych będą wyzwalane po złapaniu OptimisticLockException
, a zatem utracie całej pracy, którą wykonaliśmy poprzednio przez aktualnie wykonywaną transakcję.
Im więcej sporów, tym więcej konfliktów i większa szansa na przerwanie transakcji. Wycofanie może być kosztowne dla systemu bazy danych, ponieważ musi on cofnąć wszystkie bieżące oczekujące zmiany, które mogą obejmować zarówno wiersze tabeli, jak i rekordy indeksu.
Z tego powodu pesymistyczne blokowanie może być odpowiednie w przypadku częstych konfliktów, ponieważ zmniejsza ryzyko wycofania transakcji.