[ 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.
Copyright (C) 2001-2024 by www.elitesecurity.org. All rights reserved.