Temat: numerowanie FV i resetowanie numeru w nowym roku / oracle
Michał Z.:
Ja to zrobiłem na osobnej tabelce - jeden wiersz - jeden numerator. Do tego procedura, która po stronie serwera dba o poprawną numerację przy pomocy locka. Dzięki osobnej tabeli miałem locka na wierszu i blokowałem tylko inne operacje używające tego samego numeratora. Dodatkowo sprawdzało się wprowadzenie numeratora per rok. Czasem do 4-5 stycznia wystawiali faktury z datą grudniową, no ale ze styczniową też... W wierszu był też wprowadzony sposób numeracji - jak się komuś odwidziało - od nowego roku mógł wystartować innym sposobem numerowania. No, ale to był prosty postgresql - nie tam zaawansowany oracle :)
A czy nie miałeś przy tym hotspota?
Jest jeszcze rozwiązanie z pre-alokacją numerów.
Job co x minut / godzin odpala się i sprawdza czy jest wystarcająco dostępna pula numerów, jesli nie, generuje rekordy:
<kod sekwencji>, <numer>, <status: zajety/wolny>
Przykład:
FR0009, 1, Z
FR0009, 2, Z
FR0009, 3, W
FR0009, 4, W
FR0009, 5, W
....
Proces który potrzebuje numerka bierze pierwszy wolny i próbuje mu zmienić status:
set status = "Z"ajety where kod = x and numer = y and status = "W"olny
Proces pobierający numerek może pobrać sobie całą grupę numerów i próbować na nich do skutku (albo do końca puli).
W razie końca puli może sobie je dogenerować (z nadmiarem).
Przy tym rozwiązaniu:
- nie ma utraty numerów - co najwyżej chwilowe dziury
- nie ma hotspotów