Sekcje krytyczne
8.1 Problem
Dział zatytułowany „8.1 Problem”Dwa zamówienia przychodzą w tej samej chwili. Oba odczytują ten sam kolejny numer i oba dostają numer 7. Dwa zamówienia, jeden numer — to błąd.
8.2 Czym jest sekcja krytyczna
Dział zatytułowany „8.2 Czym jest sekcja krytyczna”Sekcja krytyczna gwarantuje, że w danej chwili może do niej wejść tylko jeden proces (albo użytkownik). Pozostałe czekają do upływu limitu czasu (timeout); jeśli sekcja nadal jest zajęta, żądanie zostaje anulowane. Sekcji możesz użyć na dwa sposoby:
- Kontener: umieszczasz wrażliwą logikę w kontenerze sekcji krytycznej. Kontener wchodzi do sekcji, wykonuje logikę i zawsze ją opuszcza — nawet jeśli w środku wystąpi błąd.
- Wejście i zwolnienie: jedna aktywność wejścia dla procesu, druga dla ekranu, potem twoja logika, a na końcu zwolnienie sekcji. Po identyfikatorze sesji (session ID) wskazujesz, którą sekcję krytyczną zwolnić.
My używamy kontenera.
8.3 Ochrona numeru zamówienia
Dział zatytułowany „8.3 Ochrona numeru zamówienia”Obejmij krok nadawania numeru kontenerem sekcji krytycznej, nazwij sekcję OrderNumbers i ustaw limit czasu (najdłuższe dozwolone oczekiwanie to 20 sekund). W środku użyj GetSequenceNextValue, żeby pobrać kolejny numer zamówienia do OrderNumber. Sama aktywność już chroni przed duplikatami — udajemy, że mogłaby nie chronić, żeby pokazać sekcję w działaniu.
8.4 Gdy nie udało się zająć sekcji
Dział zatytułowany „8.4 Gdy nie udało się zająć sekcji”Jeśli oczekiwanie trwa za długo, proces nie wchodzi do sekcji. Zapisz wyjście „czy udało się zająć sekcję” w zmiennej, a za sekcją dodaj If: jeśli się nie udało, wywołaj RaiseError z komunikatem w rodzaju „System zajęty, spróbuj ponownie”.
8.5 Zasady dobrej sekcji krytycznej
Dział zatytułowany „8.5 Zasady dobrej sekcji krytycznej”- Sekcja ma być krótka.
- Nigdy nie wstawiaj do niej kroku, który może wstrzymać proces (np.
Delay). Model się nie skompiluje. - Wybieraj kontener: ręczną parę wejście–zwolnienie łatwiej popsuć.