MS SQL - generowanie nowego numeru ID - praca jednoczesna kilku pracowników

0

W mojej firmie muszą przeprowadzić wielką inwentaryzację wyprodukowanych części. Aktualnie dane znajdują się pozapisywane na kartkach i zatrudnimy 3 dziewczyny, które wprowadzą je "do komputra". Na szybko skonstruowałem arkusz w Excelu ale podzielony tak, by łatwo wyeksportować go do relacyjnej bazy danych (czyli są relacje, numery id itd.).

W wolnej chwili zrobię tą bazę danych i będę musiał napisać jakiś prosty interface na szybko. Nie jestem programistą zawodowo a tylko "od potrzeby" (zawodowo programuję sterowniki PLC) więc wykorzystam pewnie C# i gotowe kontrolki podpięte pod bazę.

Moim zmartwieniem jest to, że do bazy wprowadzać dane będą jednocześnie trzy (lub więcej) osoby. Dodając nową CZĘŚĆ baza musi wygenerować unikalny identyfikator i wysłać go do wprowadzającej osoby. Wyobrażam sobie to tak, że dziewczyna naciska przycisk "WPROWADŹ NOWĄ CZĘŚĆ", baza generuje nowy identyfikator (np. kolejny numer) i wyświetla go dziewczynie. Ona ten numer zapisuje na kartce i następnie wprowadza dane z kartki już do tabelek wskazujących na numer identyfikatora.

Ale co będzie, jak trzy dziewczyny będą chciały nacisnąć jednocześnie ten przycisk? Czy baza sobie to jakoś zakolejkuje czy muszę coś specjalnego zrobić (jakiś znacznik? parametr) w bazie, by nie było problemów? Powtarzam, że jestem programistą "okazyjnym" :) z doskoku.

7

Nie ma czegoś takiego jak "w tym samym momencie" - zawsze któreś żądanie trafi do bazy o ułamek sekundy prędzej. Nawet jeśli baza nie zdąży go obsłużyć zanim dotrze kolejne, to niczego to nie zmieni. Ogólnie - możesz być spokojny. Typowe bazy obsługują ruch idący w dziesiątki tysięcy żądań na sekundę i dają sobie radę, więc Twoje 3 dziewczyny nie są żadnym zagrożeniem ;) Na 140% jak ustawisz ID jako PRIMARY KEY AUTOINCREMENT (albo coś podobnego - zależy od konkretnego silnika bazy) to nie ma opcji, żeby ID się powtórzyło.

2
cerrato napisał(a):

Nie ma czegoś takiego jak "w tym samym momencie" - zawsze któreś żądanie trafi do bazy o ułamek sekundy prędzej.

Tu się nie zgodzę w sensie technicznym :) Przy maszynie wieloprocesorowej, komendy języka maszynowego w komputerze są wykonywane równocześnie i niezależnie od siebie na wielu procesorach (cores).

Na jednoprocesorowej maszynie jednoczesność/współbieżność jest jedynie symulowana przez przerwania.

Na pewno o tym wiesz, ale chciałem to uwypuklić.

Oczywiście z dalszą częścią wypowiedzi się zgadzam - dla pól typu np. autoincrement (MySQL), czy Serial (PostgreSQL) generowanie numerów jest synchronizowane.

Natomiast przy ręcznym robieniu podobnych rzeczy - np. kolejny numer w danym miesiącu na podstawie poprzedniego numeru - trzeba pamiętać o synchronizacji używając odp. typu transakcji, lub klauzuli FOR UPDATE, bez względu na to czy maszyna ma jeden procesor czy wiele.

0

Nie wiem po co chcesz przepisywac ID na kartke.

Moze po prostu te ID niech sobie pracownicy sami generuja? Np o strukturze:

  • data
  • nr stanowiska
  • nr kolejny z danego dnia
    Np. 202201251A0102

Chyba ze wszystko mozesz zrobic na kompie to tak j.w. autoincremental lub sekwencja.

1

Jeżeli nie skorzystasz z identity, to zakładam że ta kolumna będzie primary key, więc sam silnik będzie pilnował czy nie powtórzą się wartości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1