Zduplikowane pytanie z:
/programming/129329/optimistic-vs-pessimistic-locking
Skopiuj / Wklej odpowiedź z powyższego linku:
Optymistyczne blokowanie to strategia polegająca na czytaniu rekordu, zanotowaniu numeru wersji i sprawdzeniu, czy wersja nie uległa zmianie przed ponownym zapisaniem rekordu. Kiedy zapisujesz rekord z powrotem, filtrujesz aktualizację do wersji, aby upewnić się, że jest atomowa. (tzn. nie został zaktualizowany między sprawdzeniem wersji i zapisaniem rekordu na dysku) a aktualizacją wersji za jednym razem.
Jeśli zapis jest brudny (tzn. Inna wersja niż Twoja), przerywasz transakcję, a użytkownik może ją ponownie uruchomić.
Strategia ta ma największe zastosowanie do systemów o dużej objętości i architektur trójwarstwowych, w których niekoniecznie utrzymuje się połączenie z bazą danych dla sesji. W tej sytuacji klient nie może faktycznie utrzymywać blokad bazy danych, ponieważ połączenia są pobierane z puli i możesz nie używać tego samego połączenia z jednego dostępu do następnego.
Blokowanie pesymistyczne ma miejsce, gdy blokujesz rekord na wyłączny użytek, dopóki go nie skończysz. Ma znacznie lepszą integralność niż optymistyczne blokowanie, ale wymaga ostrożności podczas projektowania aplikacji, aby uniknąć Deadlocks. Aby użyć blokowania pesymistycznego, potrzebujesz albo bezpośredniego połączenia z bazą danych (jak to zwykle bywa w przypadku dwupoziomowej aplikacji serwera klienta), albo dostępnego z zewnątrz identyfikatora transakcji, którego można używać niezależnie od połączenia.
W tym ostatnim przypadku otwierasz transakcję za pomocą TxID, a następnie ponownie łączysz się przy użyciu tego identyfikatora. DBMS utrzymuje blokady i pozwala wybrać sesję z powrotem poprzez TxID. Tak działają transakcje rozproszone z wykorzystaniem protokołów zatwierdzania dwufazowego (takich jak Transakcje XA lub COM +).
Edytuj (dodając więcej informacji, aby odpowiedzieć na pytanie dotyczące wydajności):
Wydajność zależy od środowiska. Podejmij następujące czynniki, aby podjąć decyzję:
przekonasz się, że optymizm będzie lepszy ze względu na współbieżność w większości sytuacji. Jednak w zależności od RDBMS i środowiska może to być mniej lub bardziej wydajne. Zazwyczaj przy blokowaniu optymistycznym okaże się, że wartość musi być gdzieś wersjonowana.
Na przykład w MS SQL Server zostaje przeniesiony do TempDB i na końcu kolumny dołączane jest coś między 12-14 bajtami. Włączenie optymistycznego blokowania z poziomem izolacji, takim jak Izolacja migawki, może spowodować fragmentację, a współczynnik wypełnienia będzie musiał zostać dostosowany, ponieważ wiersze mają teraz dodatkowe dane na końcu, co może spowodować, że strona prawie pełna spowoduje podział strony, co obniży się Twój występ. Jeśli twój TempDB nie jest zoptymalizowany, nie będzie tak szybko.
Sądzę więc, że lista kontrolna to:
- - Czy masz wystarczającą liczbę operacji we / wy do obsługi wersji wersjonowania wierszy? Jeśli nie, dodajesz koszty ogólne. Jeśli tak, to jeśli często czytasz dane, gdy często blokujesz je dla operacji zapisu, zauważysz dobrą poprawę współbieżności między odczytami i zapisami (chociaż zapisy nadal będą blokować zapisy, odczyty nie będą już blokować zapisów i na odwrót)
- -Czy twój kod jest podatny na zakleszczenia lub występuje blokowanie? Jeśli nie doświadczasz długich blokad lub wielu zakleszczeń, dodatkowy narzut optymistycznego blokowania nie przyspieszyłby, oczywiście, w większości przypadków mówimy tutaj o milisekundach.
- -Jeśli twój DB jest duży (lub na bardzo ograniczonym sprzęcie), a twoje strony danych są prawie pełne, w zależności od RDBMS, możesz spowodować poważne podziały stron i fragmentację danych, więc po włączeniu pamiętaj o ponownym indeksowaniu.
To są moje przemyślenia na ten temat, otwarte na więcej wiadomości od społeczności.