[ Enan @ 01.09.2013. 21:30 ] @
Imam glavnu tabelu DNEVNIK u centralnoj bazi, u nju upisujem podatke o prodaji iz maloprodajnih objekata,
podaci se izvezu u xml, zatim se svaki od tih udaljenih objekata zakaci na glavni server i u glavnu bazu uveze
svoj xml, ovom prilikom, kao sto pomenuh punim tabelu DNEVNIK.

Problem se desava kada se vise xml-ova izvrsava sa razlicitih radnih stanica i javlja mi se greska UNIQUE PRIMARY KEY ERROR,
mislim da se ovde desava sudar kod dodeljivanja ID vrednosti, jer firebird pokusava da upise ID koji je vec upisan u tom trenutku,
ovako mi izgleda PRIMARY KEY constraint

Constraint name: PK_DNEVNIK
On field: ID
Index name: PK_DNEVNIK
Index sorting: Ascending

Kako je moguce da firebird pravi ovakvu gresku?
[ Branko @ 02.09.2013. 09:36 ] @
Firebird ne pravi grešku, baza samo javlja da si ti pokušao da upišeš vrednost koja nije jedinstvena. Preispitaj kako određuješ primarni ključ, ili pusti Bazi da to sama uradi.
[ Enan @ 02.09.2013. 11:24 ] @
Pustam baza da sama to uradi, ne upisujem ja nikada PK, autoincrement je polje ID na kome je PK.
U pitanju je 7,8, do 10 inserta u istu tabelu, sa razlicitih radnih stanica u isto vreme.
[ Branko @ 02.09.2013. 12:42 ] @
Generatori "žive" van transakcija, znači da transakcije nisu problem. Okači triger koji koristiš, koja je verzija servera. Ja koristim firebird već godinama na dosta instalacija, i problem sa generatorima do sada nisam imao, bez obzira koliko konkurentnih konecija imao i koliko upisa istovremeno imao.
[ Enan @ 02.09.2013. 13:41 ] @
Code:

SET TERM ^ ;



CREATE OR ALTER TRIGGER RM_DNEVNIK_BI FOR RM_DNEVNIK
ACTIVE BEFORE INSERT POSITION 0
as
declare variable tmp_ID INTEGER;
declare variable tmp_carinska_stopa_id INTEGER;
begin
  if (new.id is null) then
    new.id = gen_id(gen_RM_DNEVNIK_id,1);
  execute procedure p_pronadji_id_tarife(new.zaglavlje_id,new.artikal_id,1)
     returning_values :tmp_ID;
  new.tarifa_id = :tmp_ID;
  new.tarifa_ulaz_id = :tmp_ID;

  tmp_carinska_stopa_id = 0;
  execute procedure p_pronadji_id_carinske_stope(new.zaglavlje_id,new.artikal_id,1)
    returning_values :tmp_carinska_stopa_id;
  new.carinska_stopa_id = :tmp_carinska_stopa_id;
end
^


SET TERM ; ^



Server Version: WI-V2.5.0.26074 Firebird 2.5
[ Branko @ 03.09.2013. 09:49 ] @
Da probaš da razdvojiš triger koji upisuje ključ, a ove "preračune" izoluješ u drugi triger "AFTER INSERT"? Znam da ovo zvuči kao mahanje mrtvom kokoškom (vudu), ali će bar izolovati problem.
Mogao bi sebi da postaviš i neka prizemnija pitanja:
- Da li u nekim slučajevima ipak proslediš id, jer u tom slučaju generator ne bi odbrojio ?
- Da li imaš upise u bazu koji već imaju taj id (recimo da su to podaci iz prethodnog perioda) ?
- Da li si nekom prilikom resetovao generator? Uporedi stanje generatora i najvećeg id-a u bazi.
[ Enan @ 03.09.2013. 13:48 ] @
Resetujem generatore pre bilo kakvog masovnog upisa,
sada sam postavio redosled upisa, tacnije, prvo spremim u jednom direktorijumu podatke,
odredim prioritete xml-ova za upis, a onda pustim da se izvrsava to sve po upisanom redosledu,
nema konkurentskih upisa u isto vreme.

Preuredio sam triger na nacin da imam samo ovaj deo

if (new.id is null) then
new.id = gen_id(gen_RM_DNEVNIK_id,1);

ali opet isto,

provere koje si opisao cu probati da uradim, pa javljam :D
[ Branko @ 04.09.2013. 08:37 ] @
Resetovanje generatora koji simuliraju autoinkrement polje ne dolazi u obzir (osim ,možda, kada se obrišu svi slogovi u tabeli). Postavi vrednost generatora na max(id) za tabelu, i više ga ne diraj. Izvinjavam se ako ti sve ovo znaš, a problem se nalazi negde drugo. Na forumu nikada ne znaš koliko iskustvo stoji iza nekog nika.