Nie jest to łatwy sposób, szczególnie jeśli nalegasz na następną dostępną wartość (= brak przerw). Powinieneś użyć wartości auto increment, dzięki czemu twoja aplikacja będzie działać lepiej.
Na czym polega problem?
- Trzeba uzyskać wartość z bazy
- Musisz przypisać go do podmiotu
- Musisz zapisać podmiot do bazy
wygląda łatwo, nie jest to? Nie, nie jest tak, jeśli masz współbieżne środowisko, w którym więcej niż jeden wątek może wykonać krok 1. jednocześnie, zanim inne wątki osiągną krok 3. = wszystkie wątki wstawią rekord o tej samej wartości.
Jak sobie z tym poradzić? Jednym ze sposobów jest użycie osobnej tabeli z maksymalną wartością i operacją atomową, aby uzyskać i zwiększyć wartość. Myślę, że procedura przechowywana robi coś takiego powinno być atomowy:
DECLARE @Result INT
UPDATE SequenceTable SET @Result = MaxValue = MaxValue + 1 WHERE SequnceName = '...'
RETURN @Result
Wywołanie procedury przechowywanej powinny być na zewnątrz od każdej transakcji do jak najlepszego przepustowość.
Powinno to pozwolić na wygenerowanie unikatowych liczb, ale bez sekwencji bez przerw. Jeśli weźmiesz wartość przez taką operację i nie użyjesz tej wartości, zostanie ona utracona, a twoja sekwencja będzie zawierała lukę.
Jeśli nie chcesz luki, musisz ustawić wywołanie procedury składowanej i operację na transakcję, aby rekord w tabeli sekwencji był blokowany do czasu zatwierdzenia danych.
Dzięki, że zadziałało. – Jonnster