Wielodostęp do bazy danych.

1

Witam
Nie zdążyłem douczyć się na studiach więc pytam na forum.
Aplikacja do wystawiania dokumentów numerycznych np faktur.
Z aplikacji korzysta wielu użytkowników. W jaki sposób zabezpieczyć przed dublowaniem numerów dokumentów jeżeli kilka osób wystawia w tym samym czasie dokumenty i numer dokumentu jest widoczny podczas jego tworzenia. Nr dokumentu obliczany jest na podstawie ostatniego wystawionego ale jeżeli druga osoba w tym samym czasie będzie chciała wystawić dokument zobaczy ten sam numer a powinna kolejny. I co w sytuacji kiedy osoba tworząca dokument w trakcie tworzenia zrezygnuje z jego zapisu?

2

Najprościej byłoby wywalić wyświetlanie tego numeru w czasie dodawania i już ;]
Ale jeśli musisz (co uważam za trochę bez sensu, ale ok) to mozesz zrobić tak:

  • dodać wpis do bazy, zdobywając w ten sposób unikalny numer
  • wyświetlać ten numer
  • jak user wypełni dane to robisz update tego dodanego rekordu (z naszym ID)
    Problem pojawia się kiedy user zrezygnuje. Jeśli musi kliknąć jakieś "anuluj" to pół biedy, można wtedy pozbyć się rekordu z bazy. Gorzej jeśli nie wiadomo czy user tak długo wypełnia czy olał sparwę. Jedyne rozwiązanie, aczkolwiek dość słabe, to ustawienie timeouta jakiegoś (najlepiej w postaci zegara wyświetlanego userowi z możliwością przedłużenia) tak zeby się nagle nie zdziwił jak mu braknie czas.
0

Tu muszę dobrze porozmawiać z użytkownikami chyba. Bo najlepszym rozwiązaniem jest zapisanie nr dokumentu dopiero po jego wypełnieniu.
Zawsze jak zapiszę potem okaże się, że użytkownik zrezygnował z wystawienia dokumentu a w tym czasie inny stworzy będą dziury w numeracji albo chronologia numeracja nie będzie zgodna z chronologią czasu wystawienia dokumentu a to też jest kontrolowane.
Masz rację że najlepszym rozwiązaniem jest wygenerowanie kolejnego nr dopiero podczas zapisu danych do bazy.

0

inną opcją jest przypisanie każdemu userowi innej serii numeracji
FV/2011/1/JK - jan kowalski
FV/2011/1/zb - zbigniew nowak

0

Wyświetlanie nr jeszcze nie utworzonego dokumnetu wg mnie nie ma sensu. Bo dokumnet dopiero po wypełnieniu jakiś pól ma sens. Więc sugestia tworzenia nr w momencie zapisu do bazy ma sens, bo zapewnisz ciągłe numerowanie i w dodatku będzie ono zgodne z chronologią. Chyba że datę dokumnetu wpisuje użytkownik, ale jeśli tak to nie masz szans zapewnić chronologii zgodnej z numeracją, jeśli użytkownik może tam wpisać co chce.
Oczywiście metodę generującą kolejny nr może wywołać na raz tylko jeden user, pozostali czekają aż nr nie zostanie wstawiony do bazy. Czyli najlepiej na początku transakcji wstawiającej nową fakrurę wynusić założenie blokady na wyłączność na tabelę, aby nr było zgodne z chronologią.

0

otwarcie transakcji na czas wprowadzania dokumentu, czyli od otwarcia formatki do zamknięcia, to jest całkiem niefajny pomysł. Transakcję powinno się tworzyć na czas zapisu do bazy, czuli po kliknięciu ok/zapisz/wprowadź. Chociaż oczywiście taka wisząca transakcja rozwiązała by problem, to jednak trudno w takim wypadku mówić o wielodostępie.

0

Bynajmniej nie proponuję takiej transakcji! Proponuję nie nadawać dokumnetowi żadnego nr dopóki użytkownik nie kliknie [zapisz]. Dopiero teraz wszystkie dane wstawiasz do bazy w transakcji, ale na dodatek tu należy zapewnić synchroniczny dostęp do generowania kolejnego nr faktury, czyli:
start transakcji
jakiś lock, który zablokuje inne procedury wstawiające dokumnet
generuj kolejny nr
wstaw dane
zatwierdz transakcje
zdejmij lock

jesli wystapi blad rollback tansakcje i zdejmij lock

0
paver napisał(a)

Tu muszę dobrze porozmawiać z użytkownikami chyba. Bo najlepszym rozwiązaniem jest zapisanie nr dokumentu dopiero po jego wypełnieniu.
Zawsze jak zapiszę potem okaże się, że użytkownik zrezygnował z wystawienia dokumentu a w tym czasie inny stworzy będą dziury w numeracji albo chronologia numeracja nie będzie zgodna z chronologią czasu wystawienia dokumentu a to też jest kontrolowane.
Masz rację że najlepszym rozwiązaniem jest wygenerowanie kolejnego nr dopiero podczas zapisu danych do bazy.

to jest jedyne dobre rozwiązanie. Każde, które spróbuje nadać numer przed zapisem i później łatać ew. dziury prędzej czy później się sypnie i będą z tego jedynie kłopoty. Co więcej do generowania numeru faktury nie nadają się sekwencje czy tym podobne twory z tej prostej przyczyny, że f-ry często numeruje się w ramach miesiąca oraz może być kilka serii numerów. Chyba najczęściej załatwia się to dodatkową tabelą, która przechowuje aktualne numery dla poszczególnych serii/miesięcy/lat/whatewer, i do której dostęp jest blokowany na czas nadania kolejnego numeru dla dokumentu.

0

Dodam tylko, że w implementacji tego co massther i Misiekd napisali powyżej brałem niedawno udział.

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