Oracle blad naruszono wiezy unikatowe
daxus - 24-12-2006 00:37
Oracle blad naruszono wiezy unikatowe
Mam prawdopodobnie lamerski problem - jestem cienki z baz danych.
Przeprowadzam testy dla malutkiej bazy danych w Oracle 9.2.0.1 (tabele mają 5000 wierszy) Łączę sie z poziomu java.
operacja wykonywana dla celów testowych (wyliczam czas trwania INSERTa):
100 razy wykonaj { - oblicz ostatnią (najnowszą) wartość klucza w tabeli- realizuje to funkcja, ktora przewija wiersze az do ostatniego - Insert into table .... (wstawiam cos na koniec przy pomocy uzyskanego wyzej klucza) }
Wszystko ładnie działa, ale jeżeli test jest wykonywany tylko przez jednego użytkownika. Jeżeli uruchamiam dwa razy program testowy na jednym komputerze, aby zasymulować dostęp jednoczesny dwóch użytkowników, to przy wykonaniu INSERT wyskakuje ZAWSZE DLA KILKUNASTU Z TYCH 100 operacji, podczas testu wyjątek :
java.sql.SQLException: ORA-00001: naruszono więzy unikatowe (SYSTEM.SYS_C003277)
Wyjątek nie zatrzymuje wykonania programu, ale część INSERT-ów nie wykonuje się. Dodatkowe informacje : -Ograniczenia CHECK,UNIQUE są sciagniete dla celow testowych. -próbowalem ustalać poziom izolacji na najwyzszy : Connection.TRANSACTION_SERIALIZABLE - nic nie pomoglo
Proszę o pomoc, bo mnie to niestety przerasta BBBBłłagam
Ronald Kuczek - 24-12-2006 00:37
daxus napisał(a): > > Proszę o pomoc, bo mnie to niestety przerasta
Załóż sequence i z niego pobieraj nową wartość klucza select nextval nazwa_sekwencera from dual (jakoś tak, dawno nic nie robiłem na Oracle). Załatwisz problem i z wydajnością i z więzami integralności.
Pozdrawiam Rony
Ronald Kuczek - 24-12-2006 00:37
Dodam jeszcze, że zgrabniej będzie, jak sobie sprawę załatwisz na triggerze before insert. Nową wartość klucza zawsze możesz w razie potrzeby pobrać po insert (patrz currval).
Pozdrawiam Rony
daxus - 24-12-2006 00:37
Ronald Kuczek napisał(a): > Dodam jeszcze, że zgrabniej będzie, jak sobie sprawę załatwisz na > triggerze before insert. Nową wartość klucza zawsze możesz w razie > potrzeby pobrać po insert (patrz currval). > > Pozdrawiam > Rony
Dzięki wielkie, zaraz spróbuję to zastosować. Siedze już pare godzin i nic nie moge wymyśleć (brak praktyki z BD niestety). To jest naprawde wielka rzecz że po 20 minutach mam podpowiedź - !!! :):):):)
ThomasO@cpas.com - 24-12-2006 00:37
Ronald Kuczek wrote: > Dodam jeszcze, że zgrabniej będzie, jak sobie sprawę załatwisz na > triggerze before insert. Nową wartość klucza zawsze możesz w razie > potrzeby pobrać po insert (patrz currval). > > Pozdrawiam > Rony
Tylko zeby uscislic. Propozycja Rony to jedyna mozliwosc. Usywanie SELECT MAX(...) zawsze doprowadzi do bledow. Zobacz dyskusje i przyklady: http://asktom.oracle.com/pls/ask/f?p...:1120633842332
>>potrzeby pobrać po insert (patrz currval).<< Inna opcja zeby znalezdz wartosc przypisana w triggerze to uzycie: INSERT ... RETURNING ...
HTH Thomas
ThomasO@cpas.com - 24-12-2006 00:37
Ronald Kuczek wrote: > Dodam jeszcze, że zgrabniej będzie, jak sobie sprawę załatwisz na > triggerze before insert. Nową wartość klucza zawsze możesz w razie > potrzeby pobrać po insert (patrz currval). > > Pozdrawiam > Rony
Tylko zeby uscislic. Propozycja Rony jedyna mozliwosc. Usywanie SELECT MAX(...) zawsze doprowadzi do bledow.
>>potrzeby pobrać po insert (patrz currval).<< Inna opcja zeby znalezdz wartosc przypisana w triggerze to uzycie: INSERT ... RETURNING ...
HTH Thomas
ThomasO@cpas.com - 24-12-2006 00:37
Ronald Kuczek wrote: > Dodam jeszcze, że zgrabniej będzie, jak sobie sprawę załatwisz na > triggerze before insert. Nową wartość klucza zawsze możesz w razie > potrzeby pobrać po insert (patrz currval). > > Pozdrawiam > Rony
Tylko zeby uscislic. Propozycja Rony to jedyna mozliwosc. Usywanie SELECT MAX(...) zawsze doprowadzi do bledow. Zobacz dyskusje i przyklady: http://asktom.oracle.com/pls/ask/f?p...:1120633842332
>>potrzeby pobrać po insert (patrz currval).<< Inna opcja zeby znalezdz wartosc przypisana w triggerze to uzycie: INSERT ... RETURNING ...
HTH Thomas
ThomasO@cpas.com - 24-12-2006 00:37
Thom...@cpas.com wrote: > Ronald Kuczek wrote: > > Dodam jeszcze, że zgrabniej będzie, jak sobie sprawę załatwisz na > > triggerze before insert. Nową wartość klucza zawsze możesz w razie > > potrzeby pobrać po insert (patrz currval). > > > > Pozdrawiam > > Rony > > Tylko zeby uscislic. > Propozycja Rony to jedyna mozliwosc. > Usywanie SELECT MAX(...) zawsze doprowadzi do bledow. > Zobacz dyskusje i przyklady: > http://asktom.oracle.com/pls/ask/f?p...:1120633842332 > > >>potrzeby pobrać po insert (patrz currval).<< > Inna opcja zeby znalezdz wartosc przypisana w triggerze to uzycie: > INSERT ... RETURNING ...
Przepraszam za wielokrotny post. Moj Google Groups troche zwariowal. Thomas
> > HTH > Thomas
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
Oracle 19g +Insert +Insert +Insert...
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[Oracle] jak =?ISO-8859-2?Q?ograniczy=E6_pami=EA=E6_dla_se?==?ISO-8859-2?Q?rwera=3F?=
=?ISO-8859-2?Q?=5BOT=5D_Zdany_egzamin_Oracle_1Z0-007_a?==?ISO-8859-2?Q?_brak_informacji_na_stronie_Prometric_-_czy?==?ISO-8859-2?Q?_co=B6_nie_tak=3F?=
[oracle] czy da =?ISO-8859-2?Q?si=EA_z_poziomu_procedury_?==?ISO-8859-2?Q?zrobi=E6_kopi=EA_zapasow=B1=3F?=
[oracle 10g] czy =?ISO-8859-2?Q?mo=BFna_wy=B3=B1czy=E6_wszys?==?ISO-8859-2?Q?tkie_wi=EAzy_w_schemacie=3F?=
MSSQL Express czy Oracle Express
=?iso-8859-2?q?[oracle]_Jak_sprawdzi=E6_wielko=B6=E6_tabeli_=3F=3F?=
=?ISO-8859-2?Q?Poszukjue_ksi=B1=BFki_"Oracle_?= =?ISO-8859-2?Q?optymalizacja_wydajno=B6ci"..?=
zanotowane.pldoc.pisz.plpdf.pisz.plponland.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|