Przejdź do głównej zawartości

Sekcje krytyczne

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.

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.

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.

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”.

  • 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ć.